From 76ba2dbdfeb00c357b9cb0884c058a49b6ba3246 Mon Sep 17 00:00:00 2001 From: Tiago Freitas Pereira <tiagofrepereira@gmail.com> Date: Thu, 21 Apr 2022 17:00:00 +0200 Subject: [PATCH] Deprecation move. ported image and new hdf5 support --- bob/io/__init__.py | 1 + bob/io/base/__init__.py | 799 +++--- bob/io/base/bobskin.cpp | 159 -- bob/io/base/bobskin.h | 91 - bob/io/base/codec.cpp | 48 - bob/io/base/cpp/CodecRegistry.cpp | 98 - bob/io/base/cpp/File.cpp | 10 - bob/io/base/cpp/HDF5ArrayFile.cpp | 222 -- bob/io/base/cpp/HDF5Attribute.cpp | 243 -- bob/io/base/cpp/HDF5Dataset.cpp | 612 ----- bob/io/base/cpp/HDF5File.cpp | 294 --- bob/io/base/cpp/HDF5Group.cpp | 560 ----- bob/io/base/cpp/HDF5Types.cpp | 866 ------- bob/io/base/cpp/HDF5Utils.cpp | 157 -- bob/io/base/cpp/array.cpp | 134 -- bob/io/base/cpp/array_type.cpp | 126 - bob/io/base/cpp/blitz_array.cpp | 166 -- bob/io/base/cpp/reorder.cpp | 288 --- bob/io/base/cpp/utils.cpp | 30 - bob/io/base/file.cpp | 603 ----- bob/io/base/hdf5.cpp | 2137 ----------------- .../base/include/bob.io.base/CodecRegistry.h | 81 - bob/io/base/include/bob.io.base/File.h | 184 -- .../base/include/bob.io.base/HDF5Attribute.h | 87 - bob/io/base/include/bob.io.base/HDF5Dataset.h | 536 ----- bob/io/base/include/bob.io.base/HDF5File.h | 558 ----- bob/io/base/include/bob.io.base/HDF5Group.h | 468 ---- bob/io/base/include/bob.io.base/HDF5Types.h | 508 ---- bob/io/base/include/bob.io.base/HDF5Utils.h | 135 -- bob/io/base/include/bob.io.base/api.h | 304 --- bob/io/base/include/bob.io.base/array.h | 255 -- bob/io/base/include/bob.io.base/array_type.h | 162 -- bob/io/base/include/bob.io.base/array_utils.h | 133 - bob/io/base/include/bob.io.base/blitz_array.h | 261 -- bob/io/base/include/bob.io.base/config.h | 47 - bob/io/base/include/bob.io.base/reorder.h | 94 - bob/io/base/include/bob.io.base/utils.h | 105 - bob/io/base/main.cpp | 177 -- bob/io/base/test.cpp | 103 - bob/io/base/test/__init__.py | 0 bob/io/base/test/data/cmyk.jpg | Bin 0 -> 255 bytes bob/io/base/test/data/grace_hopper.png | Bin 0 -> 628280 bytes bob/io/base/test/data/img_gray_alpha.png | Bin 0 -> 644 bytes bob/io/base/test/data/img_indexed_color.png | Bin 0 -> 1087 bytes .../test/data/img_indexed_color_alpha.png | Bin 0 -> 574 bytes bob/io/base/test/data/img_rgba_color.png | Bin 0 -> 761 bytes bob/io/base/test/data/img_trns.png | Bin 0 -> 360 bytes bob/io/base/{ => test}/data/matlab_1d.hdf5 | Bin bob/io/base/{ => test}/data/matlab_2d.hdf5 | Bin bob/io/base/test/data/test.gif | Bin 0 -> 151 bytes bob/io/base/test/data/test.jpg | Bin 0 -> 216 bytes bob/io/base/test/data/test.pbm | 3 + bob/io/base/test/data/test.pgm | Bin 0 -> 35 bytes bob/io/base/test/data/test.ppm | Bin 0 -> 83 bytes bob/io/base/{ => test}/data/test1.hdf5 | Bin .../base/{ => test}/data/test7_unlimited.hdf5 | Bin bob/io/base/test/data/test_2.pgm | Bin 0 -> 61 bytes bob/io/base/test/data/test_2.ppm | Bin 0 -> 157 bytes .../base/{ => test}/data/test_array_codec.txt | 0 bob/io/base/test/data/test_corrupted.pbm | 3 + bob/io/base/test/data/test_corrupted.pgm | Bin 0 -> 37 bytes bob/io/base/test/data/test_corrupted.ppm | Bin 0 -> 85 bytes bob/io/base/test/data/test_spaces.pgm | 6 + bob/io/base/test/test_hdf5.py | 55 + bob/io/base/test/test_image_support.py | 152 ++ bob/io/base/test/test_io.py | 96 + bob/io/base/{ => test}/test_utils.py | 0 bob/io/base/test_cpp.py | 11 - bob/io/base/test_file.py | 232 -- bob/io/base/test_hdf5.py | 546 ----- bob/io/base/test_io.py | 96 - bob/io/base/utils.py | 126 + bob/io/base/version.cpp | 81 - conda/meta.yaml | 13 +- doc/c_cpp_api.rst | 168 -- doc/extra-intersphinx.txt | 3 +- doc/guide.rst | 382 --- doc/index.rst | 10 +- doc/nitpick-exceptions.txt | 31 - doc/py_api.rst | 32 - requirements.txt | 2 - setup.py | 237 +- 82 files changed, 838 insertions(+), 13289 deletions(-) delete mode 100644 bob/io/base/bobskin.cpp delete mode 100644 bob/io/base/bobskin.h delete mode 100644 bob/io/base/codec.cpp delete mode 100644 bob/io/base/cpp/CodecRegistry.cpp delete mode 100644 bob/io/base/cpp/File.cpp delete mode 100644 bob/io/base/cpp/HDF5ArrayFile.cpp delete mode 100644 bob/io/base/cpp/HDF5Attribute.cpp delete mode 100644 bob/io/base/cpp/HDF5Dataset.cpp delete mode 100644 bob/io/base/cpp/HDF5File.cpp delete mode 100644 bob/io/base/cpp/HDF5Group.cpp delete mode 100644 bob/io/base/cpp/HDF5Types.cpp delete mode 100644 bob/io/base/cpp/HDF5Utils.cpp delete mode 100644 bob/io/base/cpp/array.cpp delete mode 100644 bob/io/base/cpp/array_type.cpp delete mode 100644 bob/io/base/cpp/blitz_array.cpp delete mode 100644 bob/io/base/cpp/reorder.cpp delete mode 100644 bob/io/base/cpp/utils.cpp delete mode 100644 bob/io/base/file.cpp delete mode 100644 bob/io/base/hdf5.cpp delete mode 100644 bob/io/base/include/bob.io.base/CodecRegistry.h delete mode 100644 bob/io/base/include/bob.io.base/File.h delete mode 100644 bob/io/base/include/bob.io.base/HDF5Attribute.h delete mode 100644 bob/io/base/include/bob.io.base/HDF5Dataset.h delete mode 100644 bob/io/base/include/bob.io.base/HDF5File.h delete mode 100644 bob/io/base/include/bob.io.base/HDF5Group.h delete mode 100644 bob/io/base/include/bob.io.base/HDF5Types.h delete mode 100644 bob/io/base/include/bob.io.base/HDF5Utils.h delete mode 100644 bob/io/base/include/bob.io.base/api.h delete mode 100644 bob/io/base/include/bob.io.base/array.h delete mode 100644 bob/io/base/include/bob.io.base/array_type.h delete mode 100644 bob/io/base/include/bob.io.base/array_utils.h delete mode 100644 bob/io/base/include/bob.io.base/blitz_array.h delete mode 100644 bob/io/base/include/bob.io.base/config.h delete mode 100644 bob/io/base/include/bob.io.base/reorder.h delete mode 100644 bob/io/base/include/bob.io.base/utils.h delete mode 100644 bob/io/base/main.cpp delete mode 100644 bob/io/base/test.cpp create mode 100644 bob/io/base/test/__init__.py create mode 100644 bob/io/base/test/data/cmyk.jpg create mode 100644 bob/io/base/test/data/grace_hopper.png create mode 100644 bob/io/base/test/data/img_gray_alpha.png create mode 100644 bob/io/base/test/data/img_indexed_color.png create mode 100644 bob/io/base/test/data/img_indexed_color_alpha.png create mode 100644 bob/io/base/test/data/img_rgba_color.png create mode 100644 bob/io/base/test/data/img_trns.png rename bob/io/base/{ => test}/data/matlab_1d.hdf5 (100%) rename bob/io/base/{ => test}/data/matlab_2d.hdf5 (100%) create mode 100644 bob/io/base/test/data/test.gif create mode 100644 bob/io/base/test/data/test.jpg create mode 100644 bob/io/base/test/data/test.pbm create mode 100644 bob/io/base/test/data/test.pgm create mode 100644 bob/io/base/test/data/test.ppm rename bob/io/base/{ => test}/data/test1.hdf5 (100%) rename bob/io/base/{ => test}/data/test7_unlimited.hdf5 (100%) create mode 100644 bob/io/base/test/data/test_2.pgm create mode 100644 bob/io/base/test/data/test_2.ppm rename bob/io/base/{ => test}/data/test_array_codec.txt (100%) create mode 100644 bob/io/base/test/data/test_corrupted.pbm create mode 100644 bob/io/base/test/data/test_corrupted.pgm create mode 100644 bob/io/base/test/data/test_corrupted.ppm create mode 100644 bob/io/base/test/data/test_spaces.pgm create mode 100644 bob/io/base/test/test_hdf5.py create mode 100644 bob/io/base/test/test_image_support.py create mode 100644 bob/io/base/test/test_io.py rename bob/io/base/{ => test}/test_utils.py (100%) delete mode 100644 bob/io/base/test_cpp.py delete mode 100644 bob/io/base/test_file.py delete mode 100644 bob/io/base/test_hdf5.py delete mode 100644 bob/io/base/test_io.py create mode 100644 bob/io/base/utils.py delete mode 100644 bob/io/base/version.cpp delete mode 100644 doc/c_cpp_api.rst delete mode 100644 doc/guide.rst diff --git a/bob/io/__init__.py b/bob/io/__init__.py index 2ab1e28..edbb409 100644 --- a/bob/io/__init__.py +++ b/bob/io/__init__.py @@ -1,3 +1,4 @@ # see https://docs.python.org/3/library/pkgutil.html from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) diff --git a/bob/io/base/__init__.py b/bob/io/base/__init__.py index dbe34b9..a32b341 100644 --- a/bob/io/base/__init__.py +++ b/bob/io/base/__init__.py @@ -1,512 +1,431 @@ # import Libraries of other lib packages -import numpy -import bob.core +import numpy as np +import h5py +from pygments import format +import imageio +import cv2 +from PIL import Image +from .utils import to_bob -# import our own Library -import bob.extension -bob.extension.load_bob_library('bob.io.base', __file__) - -from ._library import File as _File_C, HDF5File as _HDF5File_C, extensions -from . import version -from .version import module as __version__ -from .version import api as __api_version__ import os -class File(_File_C): - __doc__ = _File_C.__doc__ - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - self.close() - - -class HDF5File(_HDF5File_C): - __doc__ = _HDF5File_C.__doc__ - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - return self.close() - - def __contains__(self, x): - __doc__ = self.has_key.__doc__ - return self.has_key(x) - - def __iter__(self): - __doc__ = self.keys.__doc__ - return iter(self.keys()) - - def __getitem__(self, name): - __doc__ = self.get.__doc__ - return self.get(name) - - def __setitem__(self, name, value): - __doc__ = self.set.__doc__ - return self.set(name, value) - - def values(self): - '''Yields the datasets contained in the current directory. - - Yields - ------- - object - The datasets that are being read. - ''' - return (self[key] for key in self) - - def items(self): - '''Yields the keys and the datasets contained in the current directory. - - Yields - ------- - tuple - The key and the datasets that are being read in a tuple. - ''' - return ((key, self[key]) for key in self) +hdf5_extensions = [".hdf5", ".h5", ".hdf", ".hdf5", ".h5", ".hdf", ".hdf5"] +image_extensions = [ + ".jpg", + ".jpeg", + ".png", + ".bmp", + ".gif", + ".tif", + ".tiff", + ".pgm", + ".pbm", + ".pnm", + ".ppm", +] def _is_string(s): - """Returns ``True`` if the given object is a string + """Returns ``True`` if the given object is a string - This method can be used with Python-2.x or 3.x and returns a string - respecting each environment's constraints. - """ + This method can be used with Python-2.x or 3.x and returns a string + respecting each environment's constraints. + """ - from sys import version_info + from sys import version_info - return (version_info[0] < 3 and isinstance(s, (str, unicode))) or \ - isinstance(s, (bytes, str)) + return (version_info[0] < 3 and isinstance(s, (str, unicode))) or isinstance( + s, (bytes, str) + ) -@numpy.deprecate(new_name="os.makedirs(directory, exist_ok=True)") +@np.deprecate(new_name="os.makedirs(directory, exist_ok=True)") def create_directories_safe(directory, dryrun=False): - """Creates a directory if it does not exists, with concurrent access support. - This function will also create any parent directories that might be required. - If the dryrun option is selected, it does not actually create the directory, - but just writes the (Linux) command that would have been executed. - - **Parameters:** - - ``directory`` : str - The directory that you want to create. - - ``dryrun`` : bool - Only ``print`` the command to console, but do not execute it. - """ - if dryrun: - print("[dry-run] mkdir -p '%s'" % directory) - else: - os.makedirs(directory, exist_ok=True) - - -def load(inputs): - """load(inputs) -> data - - Loads the contents of a file, an iterable of files, or an iterable of - :py:class:`bob.io.base.File`'s into a :py:class:`numpy.ndarray`. - - **Parameters:** - - ``inputs`` : various types - - This might represent several different entities: - - 1. The name of a file (full path) from where to load the data. In this - case, this assumes that the file contains an array and returns a loaded - numpy ndarray. - 2. An iterable of filenames to be loaded in memory. In this case, this - would assume that each file contains a single 1D sample or a set of 1D - samples, load them in memory and concatenate them into a single and - returned 2D :py:class:`numpy.ndarray`. - 3. An iterable of :py:class:`File`. In this case, this would assume - that each :py:class:`File` contains a single 1D sample or a set - of 1D samples, load them in memory if required and concatenate them into - a single and returned 2D :py:class:`numpy.ndarray`. - 4. An iterable with mixed filenames and :py:class:`File`. In this - case, this would returned a 2D :py:class:`numpy.ndarray`, as described - by points 2 and 3 above. - - **Returns:** - - ``data`` : :py:class:`numpy.ndarray` - The data loaded from the given ``inputs``. - """ - - from collections.abc import Iterable - import numpy - if _is_string(inputs): - if not os.path.exists(inputs): - raise RuntimeError(f"`{inputs}' does not exist!") - return File(inputs, 'r').read() - elif isinstance(inputs, Iterable): - retval = [] - for obj in inputs: - if _is_string(obj): - retval.append(load(obj)) - elif isinstance(obj, File): - retval.append(obj.read()) - else: - raise TypeError( - "Iterable contains an object which is not a filename nor a " - "bob.io.base.File.") - return numpy.vstack(retval) - else: - raise TypeError( - "Unexpected input object. This function is expecting a filename, " - "or an iterable of filenames and/or bob.io.base.File's") - - -def merge(filenames): - """merge(filenames) -> files + """Creates a directory if it does not exists, with concurrent access support. + This function will also create any parent directories that might be required. + If the dryrun option is selected, it does not actually create the directory, + but just writes the (Linux) command that would have been executed. - Converts an iterable of filenames into an iterable over read-only - :py:class:`bob.io.base.File`'s. + **Parameters:** - **Parameters:** + ``directory`` : str + The directory that you want to create. - ``filenames`` : str or [str] - - A list of file names. - This might represent: - - 1. A single filename. In this case, an iterable with a single - :py:class:`File` is returned. - 2. An iterable of filenames to be converted into an iterable of - :py:class:`File`'s. - - **Returns:** + ``dryrun`` : bool + Only ``print`` the command to console, but do not execute it. + """ + if dryrun: + print("[dry-run] mkdir -p '%s'" % directory) + else: + os.makedirs(directory, exist_ok=True) - ``files`` : [:py:class:`File`] - The list of files. - """ - from collections import Iterable - from .utils import is_string - if is_string(filenames): - return [File(filenames, 'r')] - elif isinstance(filenames, Iterable): - return [File(k, 'r') for k in filenames] - else: - raise TypeError( - "Unexpected input object. This function is expecting an " - "iterable of filenames.") +def open_file(filename): + """open_file(filename) -> file + Opens a file for reading. -def save(array, filename, create_directories=False): - """Saves the contents of an array-like object to file. + Parameters + ---------- - Effectively, this is the same as creating a :py:class:`File` object - with the mode flag set to ``'w'`` (write with truncation) and calling - :py:meth:`File.write` passing ``array`` as parameter. + ``filename`` : str + The name of the file to open. - Parameters: - ``array`` : array_like - The array-like object to be saved on the file + """ - ``filename`` : str - The name of the file where you need the contents saved to + def check_gray(img): + # Checking for gray scaled images + if ( + img.ndim > 2 + and np.allclose(img[:, :, 0], img[:, :, 1]) + and np.allclose(img[:, :, 0], img[:, :, 2]) + ): + img = img[:, :, 0] + return img - ``create_directories`` : bool - Automatically generate the directories if required (defaults to ``False`` - because of compatibility reasons; might change in future to default to - ``True``) - """ - # create directory if not existent yet - if create_directories: - create_directories_safe(os.path.dirname(filename)) + extension = os.path.splitext(filename)[1] # get the extension - # requires data is c-contiguous and aligned, will create a copy otherwise - array = numpy.require(array, requirements=('C_CONTIGUOUS', 'ALIGNED')) + if extension in hdf5_extensions: + with h5py.File(filename, "r") as f: + if "array" not in f.keys(): + raise RuntimeError( + "The file '%s' does not contain the key 'array'" % filename + ) - return File(filename, 'w').write(array) + return np.array(f["array"]) + elif extension in image_extensions: -# Just to make it homogenous with the C++ API -write = save -read = load + img = imageio.imread(filename) + # PNGs have a 4th channel, which we don't want + # Alpha channels for instance have to be ignored + if extension.lower() == ".png": + img = img[:, :, 0:3] -def append(array, filename): - """append(array, filename) -> position - - Appends the contents of an array-like object to file. + img = check_gray(img) + return img if img.ndim == 2 else to_bob(img) + else: + raise RuntimeError(f"Unknown file extension: {extension}") - Effectively, this is the same as creating a :py:class:`File` object - with the mode flag set to ``'a'`` (append) and calling - :py:meth:`File.append` passing ``array`` as parameter. - **Parameters:** +def write_file(filename, data, format="pillow"): + """ + write_file(filename, data) -> None - ``array`` : array_like - The array-like object to be saved on the file + Writes the contents of a :py:class:`numpy.ndarray` to a file. - ``filename`` : str - The name of the file where you need the contents saved to + Parameters + ---------- - **Returns:** + ``filename`` : str + The name of the file to write to. - ``position`` : int - See :py:meth:`File.append` - """ + ``data`` : :py:class:`numpy.ndarray` + The data to write to the file. - # requires data is c-contiguous and aligned, will create a copy otherwise - array = numpy.require(array, requirements=('C_CONTIGUOUS', 'ALIGNED')) + ``format`` : str + The format to use to read the file. By default imageio selects the appropriate for you based on the filename and its contents - return File(filename, 'a').append(array) + """ -def peek(filename): - """peek(filename) -> dtype, shape, stride + extension = os.path.splitext(filename)[1] # get the extension - Returns the type of array (frame or sample) saved in the given file. + if extension in hdf5_extensions: + with h5py.File(filename, "w") as f: + f["array"] = data + elif extension in image_extensions: + # Pillow is the format with the best support for all image formats + imageio.imwrite(filename, data, format=format) + else: + raise RuntimeError(f"Unknown file extension: {extension}") - Effectively, this is the same as creating a :py:class:`File` object - with the mode flag set to `r` (read-only) and calling - :py:meth:`File.describe`. - **Parameters**: +def load(inputs): + """load(inputs) -> data + + Loads the contents of a file, an iterable of files, or an iterable of + :py:class:`bob.io.base.File`'s into a :py:class:`numpy.ndarray`. + + **Parameters:** + + ``inputs`` : various types + + This might represent several different entities: + + 1. The name of a file (full path) from where to load the data. In this + case, this assumes that the file contains an array and returns a loaded + numpy ndarray. + 2. An iterable of filenames to be loaded in memory. In this case, this + would assume that each file contains a single 1D sample or a set of 1D + samples, load them in memory and concatenate them into a single and + returned 2D :py:class:`numpy.ndarray`. + 3. An iterable of :py:class:`File`. In this case, this would assume + that each :py:class:`File` contains a single 1D sample or a set + of 1D samples, load them in memory if required and concatenate them into + a single and returned 2D :py:class:`numpy.ndarray`. + 4. An iterable with mixed filenames and :py:class:`File`. In this + case, this would returned a 2D :py:class:`numpy.ndarray`, as described + by points 2 and 3 above. + + **Returns:** + + ``data`` : :py:class:`numpy.ndarray` + The data loaded from the given ``inputs``. + """ + + from collections.abc import Iterable + import numpy + + if _is_string(inputs): + if not os.path.exists(inputs): + raise RuntimeError(f"`{inputs}' does not exist!") + return open_file(inputs) + + elif isinstance(inputs, Iterable): + retval = [] + for obj in inputs: + if _is_string(obj): + retval.append(load(obj)) + # elif isinstance(obj, File): + # retval.append(obj.read()) + else: + raise TypeError( + "Iterable contains an object which is not a filename nor a " + "bob.io.base.File." + ) + return numpy.vstack(retval) + else: + raise TypeError( + "Unexpected input object. This function is expecting a filename, " + "or an iterable of filenames and/or bob.io.base.File's" + ) - ``filename`` : str - The name of the file to peek information from - **Returns:** +def save(array, filename, create_directories=False): + """Saves the contents of an array-like object to file. - ``dtype, shape, stride`` : see :py:meth:`File.describe` - """ - return File(filename, 'r').describe() + Effectively, this is the same as creating a :py:class:`File` object + with the mode flag set to ``'w'`` (write with truncation) and calling + :py:meth:`File.write` passing ``array`` as parameter. + Parameters: -def peek_all(filename): - """peek_all(filename) -> dtype, shape, stride + ``array`` : array_like + The array-like object to be saved on the file - Returns the type of array (for full readouts) saved in the given file. + ``filename`` : str + The name of the file where you need the contents saved to - Effectively, this is the same as creating a :py:class:`File` object - with the mode flag set to ``'r'`` (read-only) and returning - ``File.describe`` with its parameter ``all`` set to ``True``. + ``create_directories`` : bool + Automatically generate the directories if required (defaults to ``False`` + because of compatibility reasons; might change in future to default to + ``True``) + """ + # create directory if not existent yet + if create_directories: + create_directories_safe(os.path.dirname(filename)) - **Parameters:** + # requires data is c-contiguous and aligned, will create a copy otherwise + array = np.require(array, requirements=("C_CONTIGUOUS", "ALIGNED")) - ``filename`` : str - The name of the file to peek information from + write_file(filename, array) - **Returns:** - ``dtype, shape, stride`` : see :py:meth:`File.describe` - """ - return File(filename, 'r').describe(all=True) +# Just to make it homogenous with the C++ API +write = save +read = load # Keeps compatibility with the previously existing API -open = File - - -def get_config(): - """Returns a string containing the configuration information. - """ - return bob.extension.get_config(__name__, version.externals, version.api) +# open = File def get_include_directories(): - """get_include_directories() -> includes - - Returns a list of include directories for dependent libraries, such as HDF5. - This function is automatically used by - :py:func:`bob.extension.get_bob_libraries` to retrieve the non-standard - include directories that are required to use the C bindings of this library - in dependent classes. You shouldn't normally need to call this function by - hand. - - **Returns:** - - ``includes`` : [str] - The list of non-standard include directories required to use the C bindings - of this class. For now, only the directory for the HDF5 headers are - returned. - """ - # try to use pkg_config first - try: - from bob.extension.utils import find_header - # locate pkg-config on our own - header = 'hdf5.h' - candidates = find_header(header) - if not candidates: - raise RuntimeError( - "could not find %s's `%s' - have you installed %s on this " - "machine?" % ('hdf5', header, 'hdf5')) - - return [os.path.dirname(candidates[0])] - except RuntimeError: - from bob.extension import pkgconfig - pkg = pkgconfig('hdf5') - return pkg.include_directories() - - -def get_macros(): - """get_macros() -> macros - - Returns a list of preprocessor macros, such as ``(HAVE_HDF5, 1)``. This - function is automatically used by :py:func:`bob.extension.get_bob_libraries` - to retrieve the prerpocessor definitions that are required to use the C - bindings of this library in dependent classes. You shouldn't normally need to - call this function by hand. - - **Returns:** - - ``macros`` : [(str,str)] - The list of preprocessor macros required to use the C bindings of this - class. For now, only ``('HAVE_HDF5', '1')`` is returned, when applicable. - """ - # get include directories - if get_include_directories(): - return [('HAVE_HDF5', '1')] + """get_include_directories() -> includes + + Returns a list of include directories for dependent libraries, such as HDF5. + This function is automatically used by + :py:func:`bob.extension.get_bob_libraries` to retrieve the non-standard + include directories that are required to use the C bindings of this library + in dependent classes. You shouldn't normally need to call this function by + hand. + + **Returns:** + + ``includes`` : [str] + The list of non-standard include directories required to use the C bindings + of this class. For now, only the directory for the HDF5 headers are + returned. + """ + # try to use pkg_config first + try: + from bob.extension.utils import find_header + + # locate pkg-config on our own + header = "hdf5.h" + candidates = find_header(header) + if not candidates: + raise RuntimeError( + "could not find %s's `%s' - have you installed %s on this " + "machine?" % ("hdf5", header, "hdf5") + ) + + return [os.path.dirname(candidates[0])] + except RuntimeError: + from bob.extension import pkgconfig + + pkg = pkgconfig("hdf5") + return pkg.include_directories() def _generate_features(reader, paths, same_size=False): - """Load and stack features in a memory efficient way. This function is - meant to be used inside :py:func:`vstack_features`. - - Parameters - ---------- - reader : ``collections.Callable`` - See the documentation of :py:func:`vstack_features`. - paths : ``collections.Iterable`` - See the documentation of :py:func:`vstack_features`. - same_size : :obj:`bool`, optional - See the documentation of :py:func:`vstack_features`. - - Yields - ------ - object - The first object returned is a tuple of :py:class:`numpy.dtype` of - features and the shape of the first feature. The rest of objects are - the actual values in features. The features are returned in C order. - """ - - shape_determined = False - for i, path in enumerate(paths): - - feature = numpy.atleast_2d(reader(path)) - feature = numpy.ascontiguousarray(feature) - if not shape_determined: - shape_determined = True - dtype = feature.dtype - shape = list(feature.shape) - yield (dtype, shape) - else: - # make sure all features have the same shape and dtype - if same_size: - assert shape == list(feature.shape), f"Expected feature shape of {shape}, got {feature.shape}" - else: - assert shape[1:] == list(feature.shape[1:]), f"Ignoring first dimension, expected feature shape of {shape}, got {feature.shape}" - assert dtype == feature.dtype + """Load and stack features in a memory efficient way. This function is + meant to be used inside :py:func:`vstack_features`. + + Parameters + ---------- + reader : ``collections.Callable`` + See the documentation of :py:func:`vstack_features`. + paths : ``collections.Iterable`` + See the documentation of :py:func:`vstack_features`. + same_size : :obj:`bool`, optional + See the documentation of :py:func:`vstack_features`. - if same_size: - yield (feature.ravel(),) - else: - for feat in feature: - yield (feat.ravel(),) + Yields + ------ + object + The first object returned is a tuple of :py:class:`numpy.dtype` of + features and the shape of the first feature. The rest of objects are + the actual values in features. The features are returned in C order. + """ + + shape_determined = False + for i, path in enumerate(paths): + + feature = np.atleast_2d(reader(path)) + feature = np.ascontiguousarray(feature) + if not shape_determined: + shape_determined = True + dtype = feature.dtype + shape = list(feature.shape) + yield (dtype, shape) + else: + # make sure all features have the same shape and dtype + if same_size: + assert shape == list( + feature.shape + ), f"Expected feature shape of {shape}, got {feature.shape}" + else: + assert shape[1:] == list( + feature.shape[1:] + ), f"Ignoring first dimension, expected feature shape of {shape}, got {feature.shape}" + assert dtype == feature.dtype + + if same_size: + yield (feature.ravel(),) + else: + for feat in feature: + yield (feat.ravel(),) def vstack_features(reader, paths, same_size=False, dtype=None): - """Stacks all features in a memory efficient way. - - Parameters - ---------- - reader : ``collections.Callable`` - The function to load the features. The function should only take one - argument ``path`` and return loaded features. Use :any:`functools.partial` - to accommodate your reader to this format. - The features returned by ``reader`` are expected to have the same - :py:class:`numpy.dtype` and the same shape except for their first - dimension. First dimension should correspond to the number of samples. - paths : ``collections.Iterable`` - An iterable of paths to iterate on. Whatever is inside path is given to - ``reader`` so they do not need to be necessarily paths to actual files. - If ``same_size`` is ``True``, ``len(paths)`` must be valid. - same_size : :obj:`bool`, optional - If ``True``, it assumes that arrays inside all the paths are the same - shape. If you know the features are the same size in all paths, set this - to ``True`` to improve the performance. - dtype : :py:class:`numpy.dtype`, optional - If provided, the data will be casted to this format. - - Returns - ------- - numpy.ndarray - The read features with the shape ``(n_samples, *features_shape[1:])``. - - Examples - -------- - This function in a simple way is equivalent to calling - ``numpy.vstack([reader(p) for p in paths])``. - - >>> import numpy - >>> from bob.io.base import vstack_features - >>> def reader(path): - ... # in each file, there are 5 samples and features are 2 dimensional. - ... return numpy.arange(10).reshape(5,2) - >>> paths = ['path1', 'path2'] - >>> all_features = vstack_features(reader, paths) - >>> numpy.allclose(all_features, numpy.array( - ... [[0, 1], - ... [2, 3], - ... [4, 5], - ... [6, 7], - ... [8, 9], - ... [0, 1], - ... [2, 3], - ... [4, 5], - ... [6, 7], - ... [8, 9]])) - True - >>> all_features_with_more_memory = numpy.vstack([reader(p) for p in paths]) - >>> numpy.allclose(all_features, all_features_with_more_memory) - True - - You can allocate the array at once to improve the performance if you know - that all features in paths have the same shape and you know the total number - of the paths: - - >>> all_features = vstack_features(reader, paths, same_size=True) - >>> numpy.allclose(all_features, numpy.array( - ... [[0, 1], - ... [2, 3], - ... [4, 5], - ... [6, 7], - ... [8, 9], - ... [0, 1], - ... [2, 3], - ... [4, 5], - ... [6, 7], - ... [8, 9]])) - True - """ - iterable = _generate_features(reader, paths, same_size) - data_dtype, shape = next(iterable) - if dtype is None: - dtype = data_dtype - if same_size: - # numpy black magic: https://stackoverflow.com/a/12473478/1286165 - field_dtype = [("", (dtype, (numpy.prod(shape),)))] - total_size = len(paths) - all_features = numpy.fromiter(iterable, field_dtype, total_size) - else: - field_dtype = [("", (dtype, (numpy.prod(shape[1:]),)))] - all_features = numpy.fromiter(iterable, field_dtype) - - # go from a field array to a normal array - all_features = all_features.view(dtype) - # the shape is assumed to be (n_samples, ...) it can be (5, 2) or (5, 3, 4). - shape = list(shape) - shape[0] = -1 - return numpy.reshape(all_features, shape, order="C") + """Stacks all features in a memory efficient way. + + Parameters + ---------- + reader : ``collections.Callable`` + The function to load the features. The function should only take one + argument ``path`` and return loaded features. Use :any:`functools.partial` + to accommodate your reader to this format. + The features returned by ``reader`` are expected to have the same + :py:class:`numpy.dtype` and the same shape except for their first + dimension. First dimension should correspond to the number of samples. + paths : ``collections.Iterable`` + An iterable of paths to iterate on. Whatever is inside path is given to + ``reader`` so they do not need to be necessarily paths to actual files. + If ``same_size`` is ``True``, ``len(paths)`` must be valid. + same_size : :obj:`bool`, optional + If ``True``, it assumes that arrays inside all the paths are the same + shape. If you know the features are the same size in all paths, set this + to ``True`` to improve the performance. + dtype : :py:class:`numpy.dtype`, optional + If provided, the data will be casted to this format. + + Returns + ------- + numpy.ndarray + The read features with the shape ``(n_samples, *features_shape[1:])``. + + Examples + -------- + This function in a simple way is equivalent to calling + ``numpy.vstack([reader(p) for p in paths])``. + + >>> import numpy + >>> from bob.io.base import vstack_features + >>> def reader(path): + ... # in each file, there are 5 samples and features are 2 dimensional. + ... return numpy.arange(10).reshape(5,2) + >>> paths = ['path1', 'path2'] + >>> all_features = vstack_features(reader, paths) + >>> numpy.allclose(all_features, numpy.array( + ... [[0, 1], + ... [2, 3], + ... [4, 5], + ... [6, 7], + ... [8, 9], + ... [0, 1], + ... [2, 3], + ... [4, 5], + ... [6, 7], + ... [8, 9]])) + True + >>> all_features_with_more_memory = numpy.vstack([reader(p) for p in paths]) + >>> numpy.allclose(all_features, all_features_with_more_memory) + True + + You can allocate the array at once to improve the performance if you know + that all features in paths have the same shape and you know the total number + of the paths: + + >>> all_features = vstack_features(reader, paths, same_size=True) + >>> numpy.allclose(all_features, numpy.array( + ... [[0, 1], + ... [2, 3], + ... [4, 5], + ... [6, 7], + ... [8, 9], + ... [0, 1], + ... [2, 3], + ... [4, 5], + ... [6, 7], + ... [8, 9]])) + True + """ + iterable = _generate_features(reader, paths, same_size) + data_dtype, shape = next(iterable) + if dtype is None: + dtype = data_dtype + if same_size: + # numpy black magic: https://stackoverflow.com/a/12473478/1286165 + field_dtype = [("", (dtype, (np.prod(shape),)))] + total_size = len(paths) + all_features = np.fromiter(iterable, field_dtype, total_size) + else: + field_dtype = [("", (dtype, (np.prod(shape[1:]),)))] + all_features = np.fromiter(iterable, field_dtype) + + # go from a field array to a normal array + all_features = all_features.view(dtype) + # the shape is assumed to be (n_samples, ...) it can be (5, 2) or (5, 3, 4). + shape = list(shape) + shape[0] = -1 + return np.reshape(all_features, shape, order="C") # gets sphinx autodoc done right - don't remove it -__all__ = [_ for _ in dir() if not _.startswith('_')] +__all__ = [_ for _ in dir() if not _.startswith("_")] diff --git a/bob/io/base/bobskin.cpp b/bob/io/base/bobskin.cpp deleted file mode 100644 index 494bdaf..0000000 --- a/bob/io/base/bobskin.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 6 Nov 07:57:57 2013 - * - * @brief Implementation of our bobskin class - */ - -#include "bobskin.h" -#include <stdexcept> - -bobskin::bobskin(PyObject* array, bob::io::base::array::ElementType eltype) { - - if (!PyArray_CheckExact(array)) { - PyErr_SetString(PyExc_TypeError, "input object to bobskin constructor is not (exactly) a numpy.ndarray"); - throw std::runtime_error("error is already set"); - } - - m_type.set<npy_intp>(eltype, PyArray_NDIM((PyArrayObject*)array), - PyArray_DIMS((PyArrayObject*)array), - PyArray_STRIDES((PyArrayObject*)array)); - - m_ptr = PyArray_DATA((PyArrayObject*)array); - -} - -bobskin::bobskin(PyArrayObject* array, bob::io::base::array::ElementType eltype) { - - m_type.set<npy_intp>(eltype, PyArray_NDIM((PyArrayObject*)array), - PyArray_DIMS((PyArrayObject*)array), - PyArray_STRIDES((PyArrayObject*)array)); - - m_ptr = PyArray_DATA((PyArrayObject*)array); - -} - -static bob::io::base::array::ElementType signed_integer_type(int bits) { - switch(bits) { - case 8: - return bob::io::base::array::t_int8; - case 16: - return bob::io::base::array::t_int16; - case 32: - return bob::io::base::array::t_int32; - case 64: - return bob::io::base::array::t_int64; - default: - PyErr_Format(PyExc_TypeError, "unsupported signed integer element type with %d bits", bits); - } - return bob::io::base::array::t_unknown; -} - -static bob::io::base::array::ElementType unsigned_integer_type(int bits) { - switch(bits) { - case 8: - return bob::io::base::array::t_uint8; - case 16: - return bob::io::base::array::t_uint16; - case 32: - return bob::io::base::array::t_uint32; - case 64: - return bob::io::base::array::t_uint64; - default: - PyErr_Format(PyExc_TypeError, "unsupported unsigned signed integer element type with %d bits", bits); - } - return bob::io::base::array::t_unknown; -} - -static bob::io::base::array::ElementType num_to_type (int num) { - switch(num) { - case NPY_BOOL: - return bob::io::base::array::t_bool; - - //signed integers - case NPY_BYTE: - return signed_integer_type(NPY_BITSOF_CHAR); - case NPY_SHORT: - return signed_integer_type(NPY_BITSOF_SHORT); - case NPY_INT: - return signed_integer_type(NPY_BITSOF_INT); - case NPY_LONG: - return signed_integer_type(NPY_BITSOF_LONG); - case NPY_LONGLONG: - return signed_integer_type(NPY_BITSOF_LONGLONG); - - //unsigned integers - case NPY_UBYTE: - return unsigned_integer_type(NPY_BITSOF_CHAR); - case NPY_USHORT: - return unsigned_integer_type(NPY_BITSOF_SHORT); - case NPY_UINT: - return unsigned_integer_type(NPY_BITSOF_INT); - case NPY_ULONG: - return unsigned_integer_type(NPY_BITSOF_LONG); - case NPY_ULONGLONG: - return unsigned_integer_type(NPY_BITSOF_LONGLONG); - - //floats - case NPY_FLOAT32: - return bob::io::base::array::t_float32; - case NPY_FLOAT64: - return bob::io::base::array::t_float64; -#ifdef NPY_FLOAT128 - case NPY_FLOAT128: - return bob::io::base::array::t_float128; -#endif - - //complex - case NPY_COMPLEX64: - return bob::io::base::array::t_complex64; - case NPY_COMPLEX128: - return bob::io::base::array::t_complex128; -#ifdef NPY_COMPLEX256 - case NPY_COMPLEX256: - return bob::io::base::array::t_complex256; -#endif - - default: - PyErr_Format(PyExc_TypeError, "unsupported NumPy element type (%d)", num); - } - - return bob::io::base::array::t_unknown; -} - -bobskin::bobskin(PyBlitzArrayObject* array) { - bob::io::base::array::ElementType eltype = num_to_type(array->type_num); - if (eltype == bob::io::base::array::t_unknown) { - throw std::runtime_error("error is already set"); - } - m_type.set<Py_ssize_t>(num_to_type(array->type_num), array->ndim, - array->shape, array->stride); - m_ptr = array->data; -} - -bobskin::~bobskin() { } - -void bobskin::set(const interface&) { - PyErr_SetString(PyExc_NotImplementedError, "setting C++ bobskin with (const interface&) is not implemented - DEBUG ME!"); - throw std::runtime_error("error is already set"); -} - -void bobskin::set(boost::shared_ptr<interface>) { - PyErr_SetString(PyExc_NotImplementedError, "setting C++ bobskin with (boost::shared_ptr<interface>) is not implemented - DEBUG ME!"); - throw std::runtime_error("error is already set"); -} - -void bobskin::set (const bob::io::base::array::typeinfo&) { - PyErr_SetString(PyExc_NotImplementedError, "setting C++ bobskin with (const typeinfo&) implemented - DEBUG ME!"); - throw std::runtime_error("error is already set"); -} - -boost::shared_ptr<void> bobskin::owner() { - PyErr_SetString(PyExc_NotImplementedError, "acquiring non-const owner from C++ bobskin is not implemented - DEBUG ME!"); - throw std::runtime_error("error is already set"); -} - -boost::shared_ptr<const void> bobskin::owner() const { - PyErr_SetString(PyExc_NotImplementedError, "acquiring const owner from C++ bobskin is not implemented - DEBUG ME!"); - throw std::runtime_error("error is already set"); -} diff --git a/bob/io/base/bobskin.h b/bob/io/base/bobskin.h deleted file mode 100644 index d18cf6e..0000000 --- a/bob/io/base/bobskin.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Tue 5 Nov 22:09:07 2013 - * - * @brief A pythonic version of bob::io::base::array::interface, with minimal - * functionality. - */ - -#ifndef PYTHON_BOB_IO_BOBSKIN_H -#define PYTHON_BOB_IO_BOBSKIN_H - -#include <Python.h> - -#include <bob.io.base/array.h> - -#include <bob.blitz/capi.h> - - -/** - * Wraps a PyArrayObject such that we can access it from bob::io - */ -class bobskin: public bob::io::base::array::interface { - - public: //api - - /** - * @brief Builds a new skin from an array like object - */ - bobskin(PyObject* array, bob::io::base::array::ElementType eltype); - - /** - * @brief Builds a new skin from a numpy array object - */ - bobskin(PyArrayObject* array, bob::io::base::array::ElementType eltype); - - /** - * @brief Builds a new skin around a blitz array object - */ - bobskin(PyBlitzArrayObject* array); - - /** - * @brief By default, the interface is never freed. You must override - * this method to do something special for your class type. - */ - virtual ~bobskin(); - - /** - * @brief Copies the data from another interface. - */ - virtual void set(const interface& other); - - /** - * @brief Refers to the data of another interface. - */ - virtual void set(boost::shared_ptr<interface> other); - - /** - * @brief Re-allocates this interface taking into consideration new - * requirements. The internal memory should be considered uninitialized. - */ - virtual void set (const bob::io::base::array::typeinfo& req); - - /** - * @brief Type information for this interface. - */ - virtual const bob::io::base::array::typeinfo& type() const { return m_type; } - - /** - * @brief Borrows a reference from the underlying memory. This means - * this object continues to be responsible for deleting the memory and - * you should make sure that it outlives the usage of the returned - * pointer. - */ - virtual void* ptr() { return m_ptr; } - virtual const void* ptr() const { return m_ptr; } - - /** - * @brief Returns a representation of the internal cache using shared - * pointers. - */ - virtual boost::shared_ptr<void> owner(); - virtual boost::shared_ptr<const void> owner() const; - - private: //representation - - bob::io::base::array::typeinfo m_type; ///< type information - void* m_ptr; ///< pointer to the data - -}; - -#endif /* PYTHON_BOB_IO_BOBSKIN_H */ diff --git a/bob/io/base/codec.cpp b/bob/io/base/codec.cpp deleted file mode 100644 index bfc3eb9..0000000 --- a/bob/io/base/codec.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 14 May 11:53:36 2014 CEST - * - * @brief Bindings to bob::io::base::CodecRegistry - */ - -#define BOB_IO_BASE_MODULE -#include <bob.io.base/api.h> - -int PyBobIoCodec_Register (const char* extension, const char* description, bob::io::base::file_factory_t factory) { - boost::shared_ptr<bob::io::base::CodecRegistry> instance = - bob::io::base::CodecRegistry::instance(); - - if (instance->isRegistered(extension)) { - PyErr_Format(PyExc_RuntimeError, "codec for extension `%s' is already registered with description `%s' - in order to register a new codec for such an extension, first unregister the existing codec", extension, PyBobIoCodec_GetDescription(extension)); - return 0; - } - - instance->registerExtension(extension, description, factory); - return 1; -} - -int PyBobIoCodec_Deregister (const char* extension) { - boost::shared_ptr<bob::io::base::CodecRegistry> instance = - bob::io::base::CodecRegistry::instance(); - - if (!instance->isRegistered(extension)) { - PyErr_Format(PyExc_RuntimeError, "there is no codec registered for extension `%s'", extension); - return 0; - } - - instance->deregisterExtension(extension); - return 1; -} - -int PyBobIoCodec_IsRegistered (const char* extension) { - boost::shared_ptr<bob::io::base::CodecRegistry> instance = - bob::io::base::CodecRegistry::instance(); - if (instance->isRegistered(extension)) return 1; - return 0; -} - -const char* PyBobIoCodec_GetDescription (const char* extension) { - boost::shared_ptr<bob::io::base::CodecRegistry> instance = - bob::io::base::CodecRegistry::instance(); - return instance->getDescription(extension); -} diff --git a/bob/io/base/cpp/CodecRegistry.cpp b/bob/io/base/cpp/CodecRegistry.cpp deleted file mode 100644 index 1f6c6d0..0000000 --- a/bob/io/base/cpp/CodecRegistry.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @date Tue Oct 25 23:25:46 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Implements the CodecRegistry class. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <vector> - -#include <boost/filesystem.hpp> -#include <boost/format.hpp> - -#include <bob.io.base/CodecRegistry.h> - -#include <bob.core/logging.h> - -boost::shared_ptr<bob::io::base::CodecRegistry> bob::io::base::CodecRegistry::instance() { - static boost::shared_ptr<bob::io::base::CodecRegistry> s_instance(new CodecRegistry()); - return s_instance; -} - -void bob::io::base::CodecRegistry::deregisterExtension(const char* ext) { - s_extension2codec.erase(ext); - s_extension2description.erase(ext); -} - -const char* bob::io::base::CodecRegistry::getDescription(const char* ext) { - auto it = s_extension2description.find(ext); - if (it == s_extension2description.end()) return 0; - return it->second.c_str(); -} - -void bob::io::base::CodecRegistry::deregisterFactory(bob::io::base::file_factory_t factory) { - - std::vector<std::string> to_remove; - for (auto it = s_extension2codec.begin(); it != s_extension2codec.end(); ++it) { - if (it->second == factory) to_remove.push_back(it->first); - } - - for (auto it = to_remove.begin(); it != to_remove.end(); ++it) { - s_extension2codec.erase(*it); - s_extension2description.erase(*it); - } - -} - -void bob::io::base::CodecRegistry::registerExtension(const char* extension, - const char* description, bob::io::base::file_factory_t codec) { - - auto it = s_extension2codec.find(extension); - - if (it == s_extension2codec.end()) { - s_extension2codec[extension] = codec; - s_extension2description[extension] = description; - } - else if (!s_ignore) { - boost::format m("extension already registered: %s - ignoring second registration with description `%s'"); - m % extension % description; - bob::core::error << m.str() << std::endl; - throw std::runtime_error(m.str()); - } - -} - -bool bob::io::base::CodecRegistry::isRegistered(const char* ext) { - std::string extension(ext); - std::string lower_extension = extension; - std::transform(extension.begin(), extension.end(), lower_extension.begin(), ::tolower); - return (s_extension2codec.find(lower_extension) != s_extension2codec.end()); -} - -bob::io::base::file_factory_t bob::io::base::CodecRegistry::findByExtension (const char* ext) { - - std::string extension(ext); - std::string lower_extension = extension; - std::transform(extension.begin(), extension.end(), lower_extension.begin(), ::tolower); - - std::map<std::string, bob::io::base::file_factory_t >::iterator it = - s_extension2codec.find(lower_extension); - - if (it == s_extension2codec.end()) { - boost::format m("unregistered extension: %s"); - m % lower_extension; - throw std::runtime_error(m.str()); - } - - return it->second; - -} - -bob::io::base::file_factory_t bob::io::base::CodecRegistry::findByFilenameExtension -(const char* filename) { - - return findByExtension(boost::filesystem::path(filename).extension().c_str()); - -} diff --git a/bob/io/base/cpp/File.cpp b/bob/io/base/cpp/File.cpp deleted file mode 100644 index bbdfedf..0000000 --- a/bob/io/base/cpp/File.cpp +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @date Tue Oct 25 23:25:46 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <bob.io.base/File.h> - -bob::io::base::File::~File() { } diff --git a/bob/io/base/cpp/HDF5ArrayFile.cpp b/bob/io/base/cpp/HDF5ArrayFile.cpp deleted file mode 100644 index 8a9aa97..0000000 --- a/bob/io/base/cpp/HDF5ArrayFile.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/** - * @date Tue Oct 25 23:25:46 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Implements the HDF5 (.hdf5) array codec - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/make_shared.hpp> -#include <boost/filesystem.hpp> -#include <boost/format.hpp> - -#include <bob.io.base/CodecRegistry.h> -#include <bob.io.base/HDF5File.h> - -/** - * Read and write arrays in HDF5 format - */ -class HDF5ArrayFile: public bob::io::base::File { - - public: - - HDF5ArrayFile (const char* filename, bob::io::base::HDF5File::mode_t mode): - m_file(filename, mode), - m_filename(filename), - m_size_arrayset(0), - m_newfile(true) { - - //tries to update the current descriptors - std::vector<std::string> paths; - m_file.paths(paths); - - if (paths.size()) { //file contains data, read it and establish defaults - m_path = paths[0]; ///< locks on a path name from now on... - m_newfile = false; ///< blocks re-initialization - - //arrayset reading - const bob::io::base::HDF5Descriptor& desc_arrayset = m_file.describe(m_path)[0]; - desc_arrayset.type.copy_to(m_type_arrayset); - m_size_arrayset = desc_arrayset.size; - - //array reading - const bob::io::base::HDF5Descriptor& desc_array = m_file.describe(m_path)[1]; - desc_array.type.copy_to(m_type_array); - - //if m_type_all has extent == 1 on the first dimension and dimension - //0 is expandable, collapse that - if (m_type_array.shape[0] == 1 && desc_arrayset.expandable) - { - m_type_array = m_type_arrayset; - } - } - - else { - //default path in case the file is new or has been truncated - m_path = "/array"; - } - - } - - virtual ~HDF5ArrayFile() { } - - virtual const char* filename() const { - return m_filename.c_str(); - } - - virtual const bob::io::base::array::typeinfo& type_all () const { - return m_type_array; - } - - virtual const bob::io::base::array::typeinfo& type () const { - return m_type_arrayset; - } - - virtual size_t size() const { - return m_size_arrayset; - } - - virtual const char* name() const { - return s_codecname.c_str(); - } - - virtual void read_all(bob::io::base::array::interface& buffer) { - - if(m_newfile) { - boost::format f("uninitialized HDF5 file at '%s' cannot be read"); - f % m_filename; - throw std::runtime_error(f.str()); - } - - if(!buffer.type().is_compatible(m_type_array)) buffer.set(m_type_array); - - m_file.read_buffer(m_path, 0, buffer.type(), buffer.ptr()); - } - - virtual void read(bob::io::base::array::interface& buffer, size_t index) { - - if(m_newfile) { - boost::format f("uninitialized HDF5 file at '%s' cannot be read"); - f % m_filename; - throw std::runtime_error(f.str()); - } - - if(!buffer.type().is_compatible(m_type_arrayset)) buffer.set(m_type_arrayset); - - m_file.read_buffer(m_path, index, buffer.type(), buffer.ptr()); - } - - virtual size_t append (const bob::io::base::array::interface& buffer) { - - if (m_newfile) { - //creates non-compressible, extensible dataset on HDF5 file - m_newfile = false; - m_file.create(m_path, buffer.type(), true, 0); - m_file.describe(m_path)[0].type.copy_to(m_type_arrayset); - m_file.describe(m_path)[1].type.copy_to(m_type_array); - - //if m_type_all has extent == 1 on the first dimension, collapse that - if (m_type_array.shape[0] == 1) m_type_array = m_type_arrayset; - } - - m_file.extend_buffer(m_path, buffer.type(), buffer.ptr()); - ++m_size_arrayset; - //needs to flush the data to the file - return m_size_arrayset - 1; ///< index of this object in the file - - } - - virtual void write (const bob::io::base::array::interface& buffer) { - - if (!m_newfile) { - boost::format f("cannot perform single (array-style) write on file/dataset at '%s' that have already been initialized -- try to use a new file"); - f % m_filename; - throw std::runtime_error(f.str()); - } - - m_newfile = false; - m_file.create(m_path, buffer.type(), false, 0); - - m_file.describe(m_path)[0].type.copy_to(m_type_arrayset); - m_file.describe(m_path)[1].type.copy_to(m_type_array); - - //if m_type_all has extent == 1 on the first dimension, collapse that - if (m_type_array.shape[0] == 1) m_type_array = m_type_arrayset; - - //otherwise, all must be in place... - m_file.write_buffer(m_path, 0, buffer.type(), buffer.ptr()); - } - - private: //representation - - bob::io::base::HDF5File m_file; - std::string m_filename; - bob::io::base::array::typeinfo m_type_array; ///< type for reading all data at once - bob::io::base::array::typeinfo m_type_arrayset; ///< type for reading data by sub-arrays - size_t m_size_arrayset; ///< number of arrays in arrayset mode - std::string m_path; ///< default path to use - bool m_newfile; ///< path check optimization - - static std::string s_codecname; - -}; - -std::string HDF5ArrayFile::s_codecname = "bob.hdf5"; - -/** - * From this point onwards we have the registration procedure. If you are - * looking at this file for a coding example, just follow the procedure bellow, - * minus local modifications you may need to apply. - */ - -/** - * This defines the factory method F that can create codecs of this type. - * - * Here are the meanings of the mode flag that should be respected by your - * factory implementation: - * - * 'r': opens for reading only - no modifications can occur; it is an - * error to open a file that does not exist for read-only operations. - * 'w': opens for reading and writing, but truncates the file if it - * exists; it is not an error to open files that do not exist with - * this flag. - * 'a': opens for reading and writing - any type of modification can - * occur. If the file does not exist, this flag is effectively like - * 'w'. - * - * Returns a newly allocated File object that can read and write data to the - * file using a specific backend. - * - * @note: This method can be static. - */ -static boost::shared_ptr<bob::io::base::File> make_file (const char* path, char mode) { - - bob::io::base::HDF5File::mode_t h5mode; - if (mode == 'r') h5mode = bob::io::base::HDF5File::in; - else if (mode == 'w') h5mode = bob::io::base::HDF5File::trunc; - else if (mode == 'a') h5mode = bob::io::base::HDF5File::inout; - else throw std::runtime_error("unsupported file opening mode"); - - return boost::make_shared<HDF5ArrayFile>(path, h5mode); - -} - -/** - * Takes care of codec registration per se. - */ -static bool register_codec() { - static const char* description = "Hierarchical Data Format v5 (default)"; - - boost::shared_ptr<bob::io::base::CodecRegistry> instance = - bob::io::base::CodecRegistry::instance(); - - instance->registerExtension(".h5", description, &make_file); - instance->registerExtension(".hdf5", description, &make_file); - instance->registerExtension(".hdf", description, &make_file); - - return true; - -} - -static bool codec_registered = register_codec(); diff --git a/bob/io/base/cpp/HDF5Attribute.cpp b/bob/io/base/cpp/HDF5Attribute.cpp deleted file mode 100644 index 0a78204..0000000 --- a/bob/io/base/cpp/HDF5Attribute.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Fri 2 Mar 08:23:47 2012 - * - * @brief Implements attribute read/write for HDF5 files - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> - -#include <bob.core/logging.h> - -#include <bob.io.base/HDF5Attribute.h> - -static std::runtime_error status_error(const char* f, herr_t s) { - boost::format m("call to HDF5 C-function %s() returned error %d. HDF5 error statck follows:\n%s"); - m % f % s % bob::io::base::format_hdf5_error(); - return std::runtime_error(m.str()); -} - -bool bob::io::base::detail::hdf5::has_attribute(const boost::shared_ptr<hid_t> location, - const std::string& name) { - return H5Aexists(*location, name.c_str()); -} - -/** - * Opens an "auto-destructible" HDF5 dataspace - */ -static void delete_h5dataspace (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Sclose(*p); - if (err < 0) { - bob::core::error << "H5Sclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_memspace(const bob::io::base::HDF5Shape& s) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5dataspace)); - *retval = H5Screate_simple(s.n(), s.get(), 0); - if (*retval < 0) throw status_error("H5Screate_simple", *retval); - return retval; -} - -/** - * Opens the memory space of attribute - */ -static boost::shared_ptr<hid_t> get_memspace(hid_t attr) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5dataspace)); - *retval = H5Aget_space(attr); - if (*retval < 0) throw status_error("H5Aget_space", *retval); - return retval; -} - -/** - * Auto-destructing HDF5 type - */ -static void delete_h5type (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Tclose(*p); - if (err < 0) { - bob::core::error << "H5Tclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -/** - * Gets datatype of attribute - */ -static boost::shared_ptr<hid_t> get_type(hid_t attr) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5type)); - *retval = H5Aget_type(attr); - if (*retval < 0) throw status_error("H5Aget_type", *retval); - return retval; -} - -/** - * Figures out the extents of an attribute - */ -static bob::io::base::HDF5Shape get_extents(hid_t space) { - int rank = H5Sget_simple_extent_ndims(space); - if (rank < 0) throw status_error("H5Sget_simple_extent_ndims", rank); - //is at least a list of scalars, but could be a list of arrays - bob::io::base::HDF5Shape shape(rank); - herr_t status = H5Sget_simple_extent_dims(space, shape.get(), 0); - if (status < 0) throw status_error("H5Sget_simple_extent_dims",status); - return shape; -} - -/** - * Opens an "auto-destructible" HDF5 attribute - */ -static void delete_h5attribute (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Aclose(*p); - if (err < 0) { - bob::core::error << "H5Aclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_attribute -(const boost::shared_ptr<hid_t> location, const std::string& name, - const bob::io::base::HDF5Type& t) { - - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5attribute)); - - *retval = H5Aopen(*location, name.c_str(), H5P_DEFAULT); - - if (*retval < 0) throw status_error("H5Aopen", *retval); - - //checks if the opened attribute is compatible w/ the expected type - bob::io::base::HDF5Type expected; - boost::shared_ptr<hid_t> atype = get_type(*retval); - if (H5Tget_class(*atype) == H5T_STRING) { - expected = bob::io::base::HDF5Type(atype); - } - else { - boost::shared_ptr<hid_t> aspace = get_memspace(*retval); - bob::io::base::HDF5Shape shape = get_extents(*aspace); - expected = bob::io::base::HDF5Type(atype, shape); - } - - if (expected != t) { - boost::format m("Trying to access attribute '%s' with incompatible buffer - expected `%s', but you gave me `%s'"); - m % name % expected.str() % t.str(); - throw std::runtime_error(m.str()); - } - - return retval; -} - -void bob::io::base::detail::hdf5::delete_attribute (boost::shared_ptr<hid_t> location, - const std::string& name) { - herr_t err = H5Adelete(*location, name.c_str()); - if (err < 0) throw status_error("H5Adelete", err); -} - -void bob::io::base::detail::hdf5::read_attribute (const boost::shared_ptr<hid_t> location, - const std::string& name, const bob::io::base::HDF5Type& dest, - void* buffer) { - boost::shared_ptr<hid_t> attribute = open_attribute(location, name, dest); - herr_t err = H5Aread(*attribute, *dest.htype(), buffer); - if (err < 0) throw status_error("H5Aread", err); -} - -void bob::io::base::detail::hdf5::gettype_attribute (const boost::shared_ptr<hid_t> location, - const std::string& name, bob::io::base::HDF5Type& type) { - - boost::shared_ptr<hid_t> attr(new hid_t(-1), - std::ptr_fun(delete_h5attribute)); - - *attr = H5Aopen(*location, name.c_str(), H5P_DEFAULT); - - if (*attr < 0) throw status_error("H5Aopen", *attr); - - boost::shared_ptr<hid_t> atype = get_type(*attr); - if (H5Tget_class(*atype) == H5T_STRING) { - type = bob::io::base::HDF5Type(atype); - } - else { - boost::shared_ptr<hid_t> aspace = get_memspace(*attr); - bob::io::base::HDF5Shape shape = get_extents(*aspace); - type = bob::io::base::HDF5Type(atype, shape); - } -} - -static boost::shared_ptr<hid_t> create_attribute(boost::shared_ptr<hid_t> loc, - const std::string& name, const bob::io::base::HDF5Type& t, - boost::shared_ptr<hid_t> space) { - - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5attribute)); - - *retval = H5Acreate2(*loc, name.c_str(), *t.htype(), *space, H5P_DEFAULT, - H5P_DEFAULT); - - if (*retval < 0) throw status_error("H5Acreate", *retval); - return retval; -} - -void bob::io::base::detail::hdf5::write_attribute (boost::shared_ptr<hid_t> location, - const std::string& name, const bob::io::base::HDF5Type& dest, const void* buffer) -{ - boost::shared_ptr<hid_t> dataspace; - //strings have to be treated slightly differently - if (dest.type() == bob::io::base::s) { - hsize_t strings = 1; - HDF5Shape shape(1, &strings); - dataspace = open_memspace(shape); - } - else { - dataspace = open_memspace(dest.shape()); - } - - if (bob::io::base::detail::hdf5::has_attribute(location, name)) bob::io::base::detail::hdf5::delete_attribute(location, name); - boost::shared_ptr<hid_t> attribute = - create_attribute(location, name, dest, dataspace); - - /* Write the attribute data. */ - herr_t err = H5Awrite(*attribute, *dest.htype(), buffer); - if (err < 0) throw status_error("H5Awrite", err); -} - -static herr_t attr_iterator (hid_t obj, const char* name, const H5A_info_t*, - void* cookie) { - std::map<std::string, bob::io::base::HDF5Type>& dict = - *static_cast<std::map<std::string, bob::io::base::HDF5Type>*>(cookie); - - boost::shared_ptr<hid_t> attr(new hid_t(-1), - std::ptr_fun(delete_h5attribute)); - - *attr = H5Aopen(obj, name, H5P_DEFAULT); - - if (*attr < 0) throw status_error("H5Aopen", *attr); - - boost::shared_ptr<hid_t> atype = get_type(*attr); - if (H5Tget_class(*atype) == H5T_STRING) { - dict[name] = bob::io::base::HDF5Type(atype); - } - else { - boost::shared_ptr<hid_t> aspace = get_memspace(*attr); - bob::io::base::HDF5Shape shape = get_extents(*aspace); - dict[name] = bob::io::base::HDF5Type(atype, shape); - } - - return 0; -} - -void bob::io::base::detail::hdf5::list_attributes(boost::shared_ptr<hid_t> location, - std::map<std::string, bob::io::base::HDF5Type>& attributes) { - hsize_t offset=0; - H5Aiterate2(*location, H5_INDEX_NAME, H5_ITER_NATIVE, &offset, attr_iterator, - static_cast<void*>(&attributes)); -} diff --git a/bob/io/base/cpp/HDF5Dataset.cpp b/bob/io/base/cpp/HDF5Dataset.cpp deleted file mode 100644 index 9fb6a0a..0000000 --- a/bob/io/base/cpp/HDF5Dataset.cpp +++ /dev/null @@ -1,612 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 29 Feb 17:51:21 2012 - * - * @brief Implementation of the Dataset class - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> -#include <boost/make_shared.hpp> -#include <boost/shared_array.hpp> - -#include <bob.core/logging.h> - -#include <bob.io.base/HDF5Utils.h> -#include <bob.io.base/HDF5Group.h> -#include <bob.io.base/HDF5Dataset.h> - -static std::runtime_error status_error(const char* f, herr_t s) { - boost::format m("call to HDF5 C-function %s() returned error %d. HDF5 error statck follows:\n%s"); - m % f % s % bob::io::base::format_hdf5_error(); - return std::runtime_error(m.str()); -} - -/** - * Opens an "auto-destructible" HDF5 dataset - */ -static void delete_h5dataset (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Dclose(*p); - if (err < 0) { - bob::core::error << "H5Dclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_dataset -(boost::shared_ptr<bob::io::base::detail::hdf5::Group>& par, const std::string& name) { - if (!name.size() || name == "." || name == "..") { - boost::format m("Cannot open dataset with illegal name `%s' at `%s:%s'"); - m % name % par->file()->filename() % par->path(); - throw std::runtime_error(m.str()); - } - - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5dataset)); - *retval = H5Dopen2(*par->location(), name.c_str(), H5P_DEFAULT); - if (*retval < 0) { - throw status_error("H5Dopen2", *retval); - } - return retval; -} - -/** - * Opens an "auto-destructible" HDF5 datatype - */ -static void delete_h5datatype (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Tclose(*p); - if (err < 0) { - bob::core::error << "H5Tclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_datatype -(const boost::shared_ptr<hid_t>& ds) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5datatype)); - *retval = H5Dget_type(*ds); - if (*retval < 0) { - throw status_error("H5Dget_type", *retval); - } - return retval; -} - -/** - * Opens an "auto-destructible" HDF5 property list - */ -static void delete_h5plist (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Pclose(*p); - if (err < 0) { - bob::core::error << "H5Pclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_plist(hid_t classid) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5plist)); - *retval = H5Pcreate(classid); - if (*retval < 0) { - throw status_error("H5Pcreate", *retval); - } - return retval; -} - -/** - * Opens an "auto-destructible" HDF5 dataspace - */ -static void delete_h5dataspace (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Sclose(*p); - if (err < 0) { - bob::core::error << "H5Sclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_filespace -(const boost::shared_ptr<hid_t>& ds) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5dataspace)); - *retval = H5Dget_space(*ds); - if (*retval < 0) throw status_error("H5Dget_space", *retval); - return retval; -} - -static boost::shared_ptr<hid_t> open_memspace(const bob::io::base::HDF5Shape& sh) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5dataspace)); - *retval = H5Screate_simple(sh.n(), sh.get(), 0); - if (*retval < 0) throw status_error("H5Screate_simple", *retval); - return retval; -} - -static void set_memspace(boost::shared_ptr<hid_t> s, const bob::io::base::HDF5Shape& sh) { - herr_t status = H5Sset_extent_simple(*s, sh.n(), sh.get(), 0); - if (status < 0) throw status_error("H5Sset_extent_simple", status); -} - -/** - * Figures out if a dataset is expandible - */ -static bool is_extensible(boost::shared_ptr<hid_t>& space) { - - //has unlimited size on first dimension? - int rank = H5Sget_simple_extent_ndims(*space); - if (rank < 0) throw status_error("H5Sget_simple_extent_ndims", rank); - - bob::io::base::HDF5Shape maxshape(rank); - herr_t status = H5Sget_simple_extent_dims(*space, 0, maxshape.get()); - if (status < 0) throw status_error("H5Sget_simple_extent_dims",status); - - return (maxshape[0] == H5S_UNLIMITED); -} - -/** - * Figures out the extents of a dataset - */ -static bob::io::base::HDF5Shape get_extents(boost::shared_ptr<hid_t>& space) { - int rank = H5Sget_simple_extent_ndims(*space); - if (rank < 0) throw status_error("H5Sget_simple_extent_ndims", rank); - //is at least a list of scalars, but could be a list of arrays - bob::io::base::HDF5Shape shape(rank); - herr_t status = H5Sget_simple_extent_dims(*space, shape.get(), 0); - if (status < 0) throw status_error("H5Sget_simple_extent_dims",status); - return shape; -} - -/** - * Creates the extensive list of compatible types for each of possible ways to - * read/write this dataset. - */ -static void reset_compatibility_list(boost::shared_ptr<hid_t>& space, - const bob::io::base::HDF5Type& file_base, std::vector<bob::io::base::HDF5Descriptor>& descr) { - - if (!file_base.shape()) throw std::runtime_error("empty HDF5 dataset"); - - descr.clear(); - - switch (file_base.shape().n()) { - - case 1: ///< file type has 1 dimension - descr.push_back(bob::io::base::HDF5Descriptor(file_base.type(), - file_base.shape()[0], is_extensible(space))); - break; - - case 2: - case 3: - case 4: - case 5: - { - bob::io::base::HDF5Shape alt = file_base.shape(); - alt <<= 1; ///< contract shape - descr.push_back(bob::io::base::HDF5Descriptor(bob::io::base::HDF5Type(file_base.type(), alt), - file_base.shape()[0], is_extensible(space)).subselect()); - } - break; - - default: - { - boost::format m("%d exceeds the number of supported dimensions"); - m % file_base.shape().n(); - throw std::runtime_error(m.str()); - } - } - - //can always read the data as a single, non-expandible array - descr.push_back(bob::io::base::HDF5Descriptor(file_base, 1, false)); -} - -bob::io::base::detail::hdf5::Dataset::Dataset(boost::shared_ptr<Group> parent, - const std::string& name) : - m_parent(parent), - m_name(name), - m_id(open_dataset(parent, name)), - m_dt(open_datatype(m_id)), - m_filespace(open_filespace(m_id)), - m_descr(), - m_memspace() -{ - bob::io::base::HDF5Type type(m_dt, get_extents(m_filespace)); - reset_compatibility_list(m_filespace, type, m_descr); - - //strings have to be treated slightly differently - if (H5Tget_class(*m_dt) == H5T_STRING) { - hsize_t strings = 1; - HDF5Shape shape(1, &strings); - m_memspace = open_memspace(shape); - } - else { - m_memspace = open_memspace(m_descr[0].type.shape()); - } -} - -/** - * Creates and writes an "empty" Dataset in an existing file. - */ -static void create_dataset (boost::shared_ptr<bob::io::base::detail::hdf5::Group> par, - const std::string& name, const bob::io::base::HDF5Type& type, bool list, - size_t compression) { - - if (!name.size() || name == "." || name == "..") { - boost::format m("Cannot create dataset with illegal name `%s' at `%s:%s'"); - m % name % par->file()->filename() % par->path(); - throw std::runtime_error(m.str()); - } - - bob::io::base::HDF5Shape xshape(type.shape()); - - if (list) { ///< if it is a list, add and extra dimension as dimension 0 - xshape = type.shape(); - xshape >>= 1; - xshape[0] = 0; ///< no elements for the time being - } - - bob::io::base::HDF5Shape maxshape(xshape); - if (list) maxshape[0] = H5S_UNLIMITED; ///< can expand forever - - //creates the data space. - boost::shared_ptr<hid_t> space(new hid_t(-1), - std::ptr_fun(delete_h5dataspace)); - *space = H5Screate_simple(xshape.n(), xshape.get(), maxshape.get()); - if (*space < 0) throw status_error("H5Screate_simple", *space); - - //creates the property list saying we need the data to be chunked if this is - //supposed to be a list -- HDF5 only supports expandability like this. - boost::shared_ptr<hid_t> dcpl = open_plist(H5P_DATASET_CREATE); - - //according to the HDF5 manual, chunks have to have the same rank as the - //array shape. - bob::io::base::HDF5Shape chunking(xshape); - chunking[0] = 1; - if (list || compression) { ///< note: compression requires chunking - herr_t status = H5Pset_chunk(*dcpl, chunking.n(), chunking.get()); - if (status < 0) throw status_error("H5Pset_chunk", status); - } - - //if the user has decided to compress the dataset, do it with gzip. - if (compression) { - if (compression > 9) compression = 9; - herr_t status = H5Pset_deflate(*dcpl, compression); - if (status < 0) throw status_error("H5Pset_deflate", status); - } - - //our link creation property list for HDF5 - boost::shared_ptr<hid_t> lcpl = open_plist(H5P_LINK_CREATE); - herr_t status = H5Pset_create_intermediate_group(*lcpl, 1); //1 == true - if (status < 0) - throw status_error("H5Pset_create_intermediate_group", status); - - //please note that we don't define the fill value as in the example, but - //according to the HDF5 documentation, this value is set to zero by default. - - boost::shared_ptr<hid_t> cls = type.htype(); - - //finally create the dataset on the file. - boost::shared_ptr<hid_t> dataset(new hid_t(-1), - std::ptr_fun(delete_h5dataset)); - *dataset = H5Dcreate2(*par->location(), name.c_str(), - *cls, *space, *lcpl, *dcpl, H5P_DEFAULT); - - if (*dataset < 0) throw status_error("H5Dcreate2", *dataset); -} - -/** - * Creates and writes an "empty" std::string Dataset in an existing file. - */ -static void create_string_dataset (boost::shared_ptr<bob::io::base::detail::hdf5::Group> par, - const std::string& name, const bob::io::base::HDF5Type& type, size_t compression) { - - if (!name.size() || name == "." || name == "..") { - boost::format m("Cannot create dataset with illegal name `%s' at `%s:%s'"); - m % name % par->file()->filename() % par->path(); - throw std::runtime_error(m.str()); - } - - //there can be only 1 string in a string dataset (for the time being) - hsize_t strings = 1; - bob::io::base::HDF5Shape xshape(1, &strings); - - //creates the data space. - boost::shared_ptr<hid_t> space(new hid_t(-1), - std::ptr_fun(delete_h5dataspace)); - *space = H5Screate_simple(xshape.n(), xshape.get(), xshape.get()); - if (*space < 0) throw status_error("H5Screate_simple", *space); - - //creates the property list saying we need the data to be chunked if this is - //supposed to be a list -- HDF5 only supports expandability like this. - boost::shared_ptr<hid_t> dcpl = open_plist(H5P_DATASET_CREATE); - - //if the user has decided to compress the dataset, do it with gzip. - if (compression) { - if (compression > 9) compression = 9; - herr_t status = H5Pset_deflate(*dcpl, compression); - if (status < 0) throw status_error("H5Pset_deflate", status); - } - - //our link creation property list for HDF5 - boost::shared_ptr<hid_t> lcpl = open_plist(H5P_LINK_CREATE); - herr_t status = H5Pset_create_intermediate_group(*lcpl, 1); //1 == true - if (status < 0) - throw status_error("H5Pset_create_intermediate_group", status); - - //please note that we don't define the fill value as in the example, but - //according to the HDF5 documentation, this value is set to zero by default. - - boost::shared_ptr<hid_t> cls = type.htype(); - - //finally create the dataset on the file. - boost::shared_ptr<hid_t> dataset(new hid_t(-1), - std::ptr_fun(delete_h5dataset)); - *dataset = H5Dcreate2(*par->location(), name.c_str(), - *cls, *space, *lcpl, *dcpl, H5P_DEFAULT); - - if (*dataset < 0) throw status_error("H5Dcreate2", *dataset); -} - -bob::io::base::detail::hdf5::Dataset::Dataset(boost::shared_ptr<Group> parent, - const std::string& name, const bob::io::base::HDF5Type& type, - bool list, size_t compression): - m_parent(parent), - m_name(name), - m_id(), - m_dt(), - m_filespace(), - m_descr(), - m_memspace() -{ - //First, we test to see if we can find the named dataset. - bob::io::base::DefaultHDF5ErrorStack->mute(); - hid_t set_id = H5Dopen2(*parent->location(),m_name.c_str(),H5P_DEFAULT); - bob::io::base::DefaultHDF5ErrorStack->unmute(); - - if (set_id < 0) { - if (type.type() == bob::io::base::s) - create_string_dataset(parent, m_name, type, compression); - else - create_dataset(parent, m_name, type, list, compression); - } - else H5Dclose(set_id); //close it, will re-open it properly - - m_id = open_dataset(parent, m_name); - m_dt = open_datatype(m_id); - m_filespace = open_filespace(m_id); - bob::io::base::HDF5Type file_type(m_dt, get_extents(m_filespace)); - reset_compatibility_list(m_filespace, file_type, m_descr); - - //strings have to be treated slightly differently - if (H5Tget_class(*m_dt) == H5T_STRING) { - hsize_t strings = 1; - HDF5Shape shape(1, &strings); - m_memspace = open_memspace(shape); - } - else { - m_memspace = open_memspace(m_descr[0].type.shape()); - } -} - -bob::io::base::detail::hdf5::Dataset::~Dataset() { } - -size_t bob::io::base::detail::hdf5::Dataset::size () const { - return m_descr[0].size; -} - -size_t bob::io::base::detail::hdf5::Dataset::size (const bob::io::base::HDF5Type& type) const { - for (size_t k=0; k<m_descr.size(); ++k) { - if (m_descr[k].type == type) return m_descr[k].size; - } - boost::format m("trying to read or write `%s' at `%s' that only accepts `%s'"); - m % type.str() % url() % m_descr[0].type.str(); - throw std::runtime_error(m.str()); -} - -const boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Dataset::parent() const { - return m_parent.lock(); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Dataset::parent() { - return m_parent.lock(); -} - -const std::string& bob::io::base::detail::hdf5::Dataset::filename() const { - return parent()->filename(); -} - -std::string bob::io::base::detail::hdf5::Dataset::url() const { - return filename() + ":" + path(); -} - -std::string bob::io::base::detail::hdf5::Dataset::path() const { - return parent()->path() + "/" + m_name; -} - -const boost::shared_ptr<bob::io::base::detail::hdf5::File> bob::io::base::detail::hdf5::Dataset::file() const { - return parent()->file(); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::File> bob::io::base::detail::hdf5::Dataset::file() { - return parent()->file(); -} - -/** - * Locates a compatible type or returns end(). - */ -static std::vector<bob::io::base::HDF5Descriptor>::iterator - find_type_index(std::vector<bob::io::base::HDF5Descriptor>& descr, - const bob::io::base::HDF5Type& user_type) { - std::vector<bob::io::base::HDF5Descriptor>::iterator it = descr.begin(); - for (; it != descr.end(); ++it) { - if (it->type == user_type) break; - } - return it; -} - -std::vector<bob::io::base::HDF5Descriptor>::iterator -bob::io::base::detail::hdf5::Dataset::select (size_t index, const bob::io::base::HDF5Type& dest) { - - //finds compatibility type - std::vector<bob::io::base::HDF5Descriptor>::iterator it = find_type_index(m_descr, dest); - - //if we cannot find a compatible type, we throw - if (it == m_descr.end()) { - boost::format m("trying to read or write `%s' at `%s' that only accepts `%s'"); - m % dest.str() % url() % m_descr[0].type.str(); - throw std::runtime_error(m.str()); - } - - //checks indexing - if (index >= it->size) { - boost::format m("trying to access element %d in Dataset '%s' that only contains %d elements"); - m % index % url() % it->size; - throw std::runtime_error(m.str()); - } - - set_memspace(m_memspace, it->type.shape()); - - it->hyperslab_start[0] = index; - - herr_t status = H5Sselect_hyperslab(*m_filespace, H5S_SELECT_SET, - it->hyperslab_start.get(), 0, it->hyperslab_count.get(), 0); - if (status < 0) throw status_error("H5Sselect_hyperslab", status); - - return it; -} - -void bob::io::base::detail::hdf5::Dataset::read_buffer (size_t index, const bob::io::base::HDF5Type& dest, void* buffer) { - - std::vector<bob::io::base::HDF5Descriptor>::iterator it = select(index, dest); - - herr_t status = H5Dread(*m_id, *it->type.htype(), - *m_memspace, *m_filespace, H5P_DEFAULT, buffer); - - if (status < 0) throw status_error("H5Dread", status); -} - -void bob::io::base::detail::hdf5::Dataset::write_buffer (size_t index, const bob::io::base::HDF5Type& dest, - const void* buffer) { - - std::vector<bob::io::base::HDF5Descriptor>::iterator it = select(index, dest); - - herr_t status = H5Dwrite(*m_id, *it->type.htype(), - *m_memspace, *m_filespace, H5P_DEFAULT, buffer); - - if (status < 0) throw status_error("H5Dwrite", status); -} - -void bob::io::base::detail::hdf5::Dataset::extend_buffer (const bob::io::base::HDF5Type& dest, const void* buffer) { - - //finds compatibility type - std::vector<bob::io::base::HDF5Descriptor>::iterator it = find_type_index(m_descr, dest); - - //if we cannot find a compatible type, we throw - if (it == m_descr.end()) { - boost::format m("trying to read or write `%s' at `%s' that only accepts `%s'"); - m % dest.str() % url() % m_descr[0].type.str(); - throw std::runtime_error(m.str()); - } - - if (!it->expandable) { - boost::format m("trying to append to '%s' that is not expandible"); - m % url(); - throw std::runtime_error(m.str()); - } - - //if it is expandible, try expansion - bob::io::base::HDF5Shape tmp(it->type.shape()); - tmp >>= 1; - tmp[0] = it->size + 1; - herr_t status = H5Dset_extent(*m_id, tmp.get()); - if (status < 0) throw status_error("H5Dset_extent", status); - - //if expansion succeeded, update all compatible types - for (size_t k=0; k<m_descr.size(); ++k) { - if (m_descr[k].expandable) { //updated only the length - m_descr[k].size += 1; - } - else { //not expandable, update the shape/count for a straight read/write - m_descr[k].type.shape()[0] += 1; - m_descr[k].hyperslab_count[0] += 1; - } - } - - m_filespace = open_filespace(m_id); //update filespace - - write_buffer(tmp[0]-1, dest, buffer); -} - -void bob::io::base::detail::hdf5::Dataset::gettype_attribute(const std::string& name, - bob::io::base::HDF5Type& type) const { - bob::io::base::detail::hdf5::gettype_attribute(m_id, name, type); -} - -bool bob::io::base::detail::hdf5::Dataset::has_attribute(const std::string& name) const { - return bob::io::base::detail::hdf5::has_attribute(m_id, name); -} - -void bob::io::base::detail::hdf5::Dataset::delete_attribute (const std::string& name) { - bob::io::base::detail::hdf5::delete_attribute(m_id, name); -} - -void bob::io::base::detail::hdf5::Dataset::read_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest_type, void* buffer) const { - bob::io::base::detail::hdf5::read_attribute(m_id, name, dest_type, buffer); -} - -void bob::io::base::detail::hdf5::Dataset::write_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest_type, const void* buffer) { - bob::io::base::detail::hdf5::write_attribute(m_id, name, dest_type, buffer); -} - -void bob::io::base::detail::hdf5::Dataset::list_attributes(std::map<std::string, bob::io::base::HDF5Type>& attributes) const { - bob::io::base::detail::hdf5::list_attributes(m_id, attributes); -} - -template <> void bob::io::base::detail::hdf5::Dataset::read<std::string>(size_t index, std::string& value) { - if (index != 0) throw std::runtime_error("Bob's HDF5 bindings do not (yet) support string vectors - reading something on position > 0 is therefore not possible"); - - size_t str_size = H5Tget_size(*m_dt); ///< finds out string size - boost::shared_array<char> storage(new char[str_size+1]); - storage[str_size] = 0; ///< null termination - - herr_t status = H5Dread(*m_id, *m_dt, *m_memspace, *m_filespace, H5P_DEFAULT, storage.get()); - if (status < 0) throw status_error("H5Dread", status); - - value = storage.get(); -} - -template <> void bob::io::base::detail::hdf5::Dataset::replace<std::string>(size_t index, const std::string& value) { - if (index != 0) throw std::runtime_error("Bob's HDF5 bindings do not (yet) support string vectors - indexing something on position > 0 is therefore not possible"); - - herr_t status = H5Dwrite(*m_id, *m_dt, *m_memspace, *m_filespace, H5P_DEFAULT, value.c_str()); - if (status < 0) throw status_error("H5Dwrite", status); -} - -template <> void bob::io::base::detail::hdf5::Dataset::add<std::string>(const std::string& value) { - herr_t status = H5Dwrite(*m_id, *m_dt, *m_memspace, *m_filespace, H5P_DEFAULT, value.c_str()); - if (status < 0) throw status_error("H5Dwrite", status); -} - -template <> void bob::io::base::detail::hdf5::Dataset::set_attribute<std::string>(const std::string& name, const std::string& v) { - bob::io::base::HDF5Type dest_type(v); - write_attribute(name, dest_type, reinterpret_cast<const void*>(v.c_str())); -} - -template <> std::string bob::io::base::detail::hdf5::Dataset::get_attribute(const std::string& name) const { - HDF5Type type; - gettype_attribute(name, type); - boost::shared_array<char> v(new char[type.shape()[0]+1]); - v[type.shape()[0]] = 0; ///< null termination - read_attribute(name, type, reinterpret_cast<void*>(v.get())); - std::string retval(v.get()); - return retval; -} diff --git a/bob/io/base/cpp/HDF5File.cpp b/bob/io/base/cpp/HDF5File.cpp deleted file mode 100644 index 549069f..0000000 --- a/bob/io/base/cpp/HDF5File.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/** - * @date Wed Jun 22 17:50:08 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Implementation of the read/write functionality for HDF5 files - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> - -#include <bob.io.base/HDF5File.h> - -static unsigned int getH5Access (bob::io::base::HDF5File::mode_t v) { - switch(v) { - case 0: return H5F_ACC_RDONLY; - case 1: return H5F_ACC_RDWR; - case 2: return H5F_ACC_TRUNC; - case 4: return H5F_ACC_EXCL; - default: - { - boost::format m("Trying to use an undefined access mode '%d'"); - m % v; - throw std::runtime_error(m.str()); - } - } -} - -bob::io::base::HDF5File::HDF5File(const std::string& filename, mode_t mode): - m_file(new bob::io::base::detail::hdf5::File(filename, getH5Access(mode))), - m_cwd(m_file->root()) ///< we start by looking at the root directory -{ -} - -bob::io::base::HDF5File::HDF5File(const std::string& filename, const char mode): -m_file(), -m_cwd() -{ - bob::io::base::HDF5File::mode_t new_mode = bob::io::base::HDF5File::inout; - switch (mode){ - case 'r': new_mode = bob::io::base::HDF5File::in; break; - case 'a': new_mode = bob::io::base::HDF5File::inout; break; - case 'w': new_mode = bob::io::base::HDF5File::trunc; break; - case 'x': new_mode = bob::io::base::HDF5File::excl; break; - default: - throw std::runtime_error("Supported flags are 'r' (read-only), 'a' (read/write/append), 'w' (read/write/truncate) or 'x' (read/write/exclusive)"); - } - m_file.reset(new bob::io::base::detail::hdf5::File(filename, getH5Access(new_mode))); - m_cwd = m_file->root(); ///< we start by looking at the root directory - -} - -bob::io::base::HDF5File::HDF5File(const bob::io::base::HDF5File& other_file): - m_file(other_file.m_file), - m_cwd(other_file.m_cwd) -{ -} - -bob::io::base::HDF5File::~HDF5File() { -} - -bob::io::base::HDF5File& bob::io::base::HDF5File::operator =(const bob::io::base::HDF5File& other_file){ - m_file = other_file.m_file; - m_cwd = other_file.m_cwd; - return *this; -} - -void bob::io::base::HDF5File::close() { - m_file.reset(); - m_cwd.reset(); -} - -void bob::io::base::HDF5File::cd(const std::string& path) { - check_open(); - m_cwd = m_cwd->cd(path); -} - -bool bob::io::base::HDF5File::hasGroup(const std::string& path) { - check_open(); - return m_cwd->has_group(path); -} - -void bob::io::base::HDF5File::createGroup(const std::string& path) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot create group '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - m_cwd->create_group(path); -} - -std::string bob::io::base::HDF5File::cwd() const { - check_open(); - return m_cwd->path(); -} - -bool bob::io::base::HDF5File::contains (const std::string& path) const { - check_open(); - return m_cwd->has_dataset(path); -} - -const std::vector<bob::io::base::HDF5Descriptor>& bob::io::base::HDF5File::describe -(const std::string& path) const { - check_open(); - return (*m_cwd)[path]->m_descr; -} - -void bob::io::base::HDF5File::unlink (const std::string& path) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot remove dataset at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - m_cwd->remove_dataset(path); -} - -void bob::io::base::HDF5File::rename (const std::string& from, const std::string& to) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot rename dataset '%s' -> '%s' at path '%s' of file '%s' because it is not writeable"); - m % from % to % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - m_cwd->rename_dataset(from, to); - std::string current_path = m_cwd->path(); - m_file->reset(); //re-read the whole structure - m_cwd = m_file->root(); - m_cwd = m_cwd->cd(current_path); //go back to the path we were before -} - -void bob::io::base::HDF5File::copy (HDF5File& other) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot copy data of file '%s' to path '%s' of file '%s' because it is not writeable"); - m % other.filename() % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - - //groups - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Group> > group_map_type; - const group_map_type& group_map = other.m_file->root()->groups(); - for (group_map_type::const_iterator it=group_map.begin(); - it != group_map.end(); ++it) { - m_cwd->copy_group(it->second, it->first); - } - - //datasets - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> > dataset_map_type; - const dataset_map_type& dataset_map = other.m_file->root()->datasets(); - for (dataset_map_type::const_iterator it=dataset_map.begin(); - it != dataset_map.end(); ++it) { - m_cwd->copy_dataset(it->second, it->first); - } -} - -void bob::io::base::HDF5File::create (const std::string& path, const bob::io::base::HDF5Type& type, - bool list, size_t compression) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot create dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - if (!contains(path)) m_cwd->create_dataset(path, type, list, compression); - else (*m_cwd)[path]->size(type); -} - -void bob::io::base::HDF5File::read_buffer (const std::string& path, size_t pos, - const bob::io::base::HDF5Type& type, void* buffer) const { - check_open(); - (*m_cwd)[path]->read_buffer(pos, type, buffer); -} - -void bob::io::base::HDF5File::write_buffer (const std::string& path, - size_t pos, const bob::io::base::HDF5Type& type, const void* buffer) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot write to object '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - (*m_cwd)[path]->write_buffer(pos, type, buffer); -} - -void bob::io::base::HDF5File::extend_buffer(const std::string& path, - const bob::io::base::HDF5Type& type, const void* buffer) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot extend object '%s' at path '%s' of file '%s' because the file is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - (*m_cwd)[path]->extend_buffer(type, buffer); -} - -bool bob::io::base::HDF5File::hasAttribute(const std::string& path, - const std::string& name) const { - check_open(); - if (m_cwd->has_dataset(path)) { - return (*m_cwd)[path]->has_attribute(name); - } - else if (m_cwd->has_group(path)) { - return m_cwd->cd(path)->has_attribute(name); - } - return false; -} - -void bob::io::base::HDF5File::getAttributeType(const std::string& path, - const std::string& name, HDF5Type& type) const { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->gettype_attribute(name, type); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->gettype_attribute(name, type); - } - else { - boost::format m("cannot read attribute '%s' type at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::HDF5File::deleteAttribute(const std::string& path, - const std::string& name) { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->delete_attribute(name); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->delete_attribute(name); - } - else { - boost::format m("cannot delete attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::HDF5File::listAttributes(const std::string& path, - std::map<std::string, bob::io::base::HDF5Type>& attributes) const { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->list_attributes(attributes); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->list_attributes(attributes); - } - else { - boost::format m("cannot list attributes at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::HDF5File::read_attribute(const std::string& path, - const std::string& name, const bob::io::base::HDF5Type& type, void* buffer) const { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->read_attribute(name, type, buffer); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->read_attribute(name, type, buffer); - } - else { - boost::format m("cannot get attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::HDF5File::write_attribute(const std::string& path, - const std::string& name, const bob::io::base::HDF5Type& type, const void* buffer) { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->write_attribute(name, type, buffer); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->write_attribute(name, type, buffer); - } - else { - boost::format m("cannot set attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::HDF5File::check_open() const{ - if (!m_cwd || ! m_file){ - throw std::runtime_error("The file is not opened yet / any more"); - } -} diff --git a/bob/io/base/cpp/HDF5Group.cpp b/bob/io/base/cpp/HDF5Group.cpp deleted file mode 100644 index 6c39b18..0000000 --- a/bob/io/base/cpp/HDF5Group.cpp +++ /dev/null @@ -1,560 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 29 Feb 17:24:10 2012 - * - * @brief Implements HDF5 groups. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/make_shared.hpp> -#include <boost/shared_array.hpp> -#include <boost/filesystem.hpp> -#include <boost/format.hpp> -#include <boost/algorithm/string.hpp> - -#include <bob.core/logging.h> - -#include <bob.io.base/HDF5Group.h> -#include <bob.io.base/HDF5Utils.h> - -/** - * Creates an "auto-destructible" HDF5 Group - */ -static void delete_h5g (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Gclose(*p); - if (err < 0) { - bob::core::error << "H5Gclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> create_new_group(boost::shared_ptr<hid_t> p, - const std::string& name) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5g)); - *retval = H5Gcreate2(*p, name.c_str(), H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Gcreate2() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; -} - -static boost::shared_ptr<hid_t> open_group(boost::shared_ptr<hid_t> g, - const char* name) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5g)); - *retval = H5Gopen2(*g, name, H5P_DEFAULT); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Gopen2() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; -} - -bob::io::base::detail::hdf5::Group::Group(boost::shared_ptr<Group> parent, const std::string& name): - m_name(name), - m_id(create_new_group(parent->location(), name)), - m_parent(parent) -{ -} - -/** - * Simple wrapper to call internal bob::io::base::detail::hdf5::Group::iterate_callback, that can call - * Group and Dataset constructors. Note that those are private or protected for - * design reasons. - */ -static herr_t group_iterate_callback(hid_t self, const char *name, - const H5L_info_t *info, void *object) { - return static_cast<bob::io::base::detail::hdf5::Group*>(object)->iterate_callback(self, name, info); -} - -herr_t bob::io::base::detail::hdf5::Group::iterate_callback(hid_t self, const char *name, - const H5L_info_t *info) { - - // If we are not looking at a hard link to the data, just ignore - if (info->type != H5L_TYPE_HARD) { - TDEBUG1("Ignoring soft-link `" << name << "' in HDF5 file"); - return 0; - } - - // Get information about the HDF5 object - H5O_info_t obj_info; - herr_t status = H5Oget_info_by_name(self, name, &obj_info, H5P_DEFAULT); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Oget_info_by_name() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - switch(obj_info.type) { - case H5O_TYPE_GROUP: - //creates with recursion - m_groups[name] = boost::make_shared<bob::io::base::detail::hdf5::Group>(shared_from_this(), - name, true); - m_groups[name]->open_recursively(); - break; - case H5O_TYPE_DATASET: - m_datasets[name] = boost::make_shared<bob::io::base::detail::hdf5::Dataset>(shared_from_this(), - std::string(name)); - break; - default: - break; - } - - return 0; -} - -bob::io::base::detail::hdf5::Group::Group(boost::shared_ptr<Group> parent, - const std::string& name, bool): - m_name(name), - m_id(open_group(parent->location(), name.c_str())), - m_parent(parent) -{ - //checks name - if (!m_name.size() || m_name == "." || m_name == "..") { - boost::format m("Cannot create group with illegal name `%s' at `%s'"); - m % name % url(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::detail::hdf5::Group::open_recursively() { - //iterates over this group only and instantiates what needs to be instantiated - herr_t status = H5Literate(*m_id, H5_INDEX_NAME, - H5_ITER_NATIVE, 0, group_iterate_callback, static_cast<void*>(this)); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Literate() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } -} - -bob::io::base::detail::hdf5::Group::Group(boost::shared_ptr<File> parent): - m_name(""), - m_id(open_group(parent->location(), "/")), - m_parent() -{ -} - -bob::io::base::detail::hdf5::Group::~Group() { } - -const boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Group::parent() const { - return m_parent.lock(); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Group::parent() { - return m_parent.lock(); -} - -const std::string& bob::io::base::detail::hdf5::Group::filename() const { - return parent()->filename(); -} - -std::string bob::io::base::detail::hdf5::Group::path() const { - return (m_name.size()?parent()->path():"") + "/" + m_name; -} - -std::string bob::io::base::detail::hdf5::Group::url() const { - return filename() + ":" + path(); -} - -const boost::shared_ptr<bob::io::base::detail::hdf5::File> bob::io::base::detail::hdf5::Group::file() const { - return parent()->file(); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::File> bob::io::base::detail::hdf5::Group::file() { - return parent()->file(); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Group::cd(const std::string& dir) { - //empty dir == void action, return self - if (!dir.size()) return shared_from_this(); - - if (dir[0] == '/') { //absolute path given, apply to root node - return file()->root()->cd(dir.substr(1)); - } - - //relative path given, start from self - std::string::size_type pos = dir.find_first_of('/'); - if (pos == std::string::npos) { //it should be one of my children - if (dir == ".") return shared_from_this(); - if (dir == "..") { - if (!m_name.size()) { //this is the root group already - boost::format m("Cannot go beyond root directory at file `%s'"); - m % file()->filename(); - throw std::runtime_error(m.str()); - } - //else, just return its parent - return parent(); - } - if (!has_group(dir)) { - boost::format m("Cannot find group `%s' at `%s'"); - m % dir % url(); - throw std::runtime_error(m.str()); - } - //else, just return the named group - return m_groups[dir]; - } - - //if you get to this point, we are just traversing - std::string mydir = dir.substr(0, pos); - if (mydir == ".") return cd(dir.substr(pos+1)); - if (mydir == "..") return parent()->cd(dir.substr(pos+1)); - if (!has_group(mydir)) { - boost::format m("Cannot find group `%s' at `%s'"); - m % dir % url(); - throw std::runtime_error(m.str()); - } - - //else, just recurse to the next group - return m_groups[mydir]->cd(dir.substr(pos+1)); -} - -const boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Group::cd(const std::string& dir) const { - return const_cast<bob::io::base::detail::hdf5::Group*>(this)->cd(dir); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> bob::io::base::detail::hdf5::Group::operator[] (const std::string& dir) { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //search on the current group - if (!has_dataset(dir)) { - boost::format m("Cannot find dataset `%s' at `%s'"); - m % dir % url(); - throw std::runtime_error(m.str()); - } - return m_datasets[dir]; - } - - //if you get to this point, the search routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or raise an exception. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->operator[](dir.substr(pos+1)); -} - -const boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> bob::io::base::detail::hdf5::Group::operator[] (const std::string& dir) const { - return const_cast<bob::io::base::detail::hdf5::Group*>(this)->operator[](dir); -} - -void bob::io::base::detail::hdf5::Group::reset() { - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Group> > group_map_type; - for (group_map_type::const_iterator it = m_groups.begin(); - it != m_groups.end(); ++it) { - remove_group(it->first); - } - - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> > - dataset_map_type; - for (dataset_map_type::const_iterator it = m_datasets.begin(); - it != m_datasets.end(); ++it) { - remove_dataset(it->first); - } -} - -boost::shared_ptr<bob::io::base::detail::hdf5::Group> bob::io::base::detail::hdf5::Group::create_group(const std::string& dir) { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //creates on the current group - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = - boost::make_shared<bob::io::base::detail::hdf5::Group>(shared_from_this(), dir); - m_groups[dir] = g; - return g; - } - - //if you get to this point, the search routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or raise an exception. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->create_group(dir.substr(pos+1)); -} - -void bob::io::base::detail::hdf5::Group::remove_group(const std::string& dir) { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //copy on the current group - herr_t status = H5Ldelete(*m_id, dir.c_str(), H5P_DEFAULT); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Ldelete() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Group> > map_type; - map_type::iterator it = m_groups.find(dir); - m_groups.erase(it); - return; - } - - //if you get to this point, the removal routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or raise an exception. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->remove_group(dir.substr(pos+1)); -} - -/** - * Opens an "auto-destructible" HDF5 property list - */ -static void delete_h5plist (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Pclose(*p); - if (err < 0) { - bob::core::error << "H5Pclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_plist(hid_t classid) { - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5plist)); - *retval = H5Pcreate(classid); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Pcreate() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; -} - -void bob::io::base::detail::hdf5::Group::rename_group(const std::string& from, const std::string& to) { - boost::shared_ptr<hid_t> create_props = open_plist(H5P_LINK_CREATE); - H5Pset_create_intermediate_group(*create_props, 1); - herr_t status = H5Lmove(*m_id, from.c_str(), H5L_SAME_LOC, to.c_str(), - *create_props, H5P_DEFAULT); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Lmove() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::detail::hdf5::Group::copy_group(const boost::shared_ptr<Group> other, - const std::string& dir) { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //copy on the current group - const char* use_name = dir.size()?dir.c_str():other->name().c_str(); - herr_t status = H5Ocopy(*other->parent()->location(), - other->name().c_str(), *m_id, use_name, H5P_DEFAULT, H5P_DEFAULT); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Ocopy() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - //read new group contents - boost::shared_ptr<bob::io::base::detail::hdf5::Group> copied = - boost::make_shared<bob::io::base::detail::hdf5::Group>(shared_from_this(), use_name); - copied->open_recursively(); - - //index it - m_groups[use_name] = copied; - - return; - } - - //if you get to this point, the copy routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or return false. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->copy_group(other, dir.substr(pos+1)); -} - -bool bob::io::base::detail::hdf5::Group::has_group(const std::string& dir) const { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //search on the current group - if (dir == "." || dir == "..") return true; //special case - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Group> > map_type; - map_type::const_iterator it = m_groups.find(dir); - return (it != m_groups.end()); - } - - //if you get to this point, the search routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or return false. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->has_group(dir.substr(pos+1)); -} - -boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> bob::io::base::detail::hdf5::Group::create_dataset -(const std::string& dir, const bob::io::base::HDF5Type& type, bool list, - size_t compression) { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //creates on the current group - boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> d = - boost::make_shared<bob::io::base::detail::hdf5::Dataset>(shared_from_this(), dir, type, - list, compression); - m_datasets[dir] = d; - return d; - } - - //if you get to this point, the search routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or return false. - std::string dest = dir.substr(0, pos); - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g; - if (!dest.size()) g = cd("/"); - else { - //let's make sure the directory exists, or let's create it recursively - if (!has_group(dest)) g = create_group(dest); - else g = cd(dest); - } - return g->create_dataset(dir.substr(pos+1), type, list, compression); -} - -void bob::io::base::detail::hdf5::Group::remove_dataset(const std::string& dir) { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //removes on the current group - herr_t status = H5Ldelete(*m_id, dir.c_str(), H5P_DEFAULT); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Ldelete() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> > map_type; - map_type::iterator it = m_datasets.find(dir); - m_datasets.erase(it); - return; - } - - //if you get to this point, the removal routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or raise an exception. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->remove_dataset(dir.substr(pos+1)); -} - -void bob::io::base::detail::hdf5::Group::rename_dataset(const std::string& from, const std::string& to) { - boost::shared_ptr<hid_t> create_props = open_plist(H5P_LINK_CREATE); - H5Pset_create_intermediate_group(*create_props, 1); - herr_t status = H5Lmove(*m_id, from.c_str(), H5L_SAME_LOC, to.c_str(), - *create_props, H5P_DEFAULT); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Ldelete() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } -} - -void bob::io::base::detail::hdf5::Group::copy_dataset(const boost::shared_ptr<Dataset> other, - const std::string& dir) { - - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //search on the current group - const char* use_name = dir.size()?dir.c_str():other->name().c_str(); - herr_t status = H5Ocopy(*other->parent()->location(), - other->name().c_str(), *m_id, use_name, H5P_DEFAULT, H5P_DEFAULT); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Ocopy() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - //read new group contents - m_datasets[use_name] = boost::make_shared<bob::io::base::detail::hdf5::Dataset>(shared_from_this(), use_name); - return; - } - - //if you get to this point, the copy routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->copy_dataset(other, dir.substr(pos+1)); -} - -bool bob::io::base::detail::hdf5::Group::has_dataset(const std::string& dir) const { - std::string::size_type pos = dir.find_last_of('/'); - if (pos == std::string::npos) { //search on the current group - typedef std::map<std::string, boost::shared_ptr<bob::io::base::detail::hdf5::Dataset> > map_type; - map_type::const_iterator it = m_datasets.find(dir); - return (it != m_datasets.end()); - } - - //if you get to this point, the search routine needs to be performed on - //another group, indicated by the path. So, we first cd() there and then do - //the same as we do here. This will recurse through the directory structure - //until we find the place defined by the user or return false. - std::string dest = dir.substr(0, pos); - if (!dest.size()) dest = "/"; - boost::shared_ptr<bob::io::base::detail::hdf5::Group> g = cd(dest); - return g->has_dataset(dir.substr(pos+1)); -} - -void bob::io::base::detail::hdf5::Group::gettype_attribute(const std::string& name, - bob::io::base::HDF5Type& type) const { - bob::io::base::detail::hdf5::gettype_attribute(m_id, name, type); -} - -bool bob::io::base::detail::hdf5::Group::has_attribute(const std::string& name) const { - return bob::io::base::detail::hdf5::has_attribute(m_id, name); -} - -void bob::io::base::detail::hdf5::Group::delete_attribute (const std::string& name) { - bob::io::base::detail::hdf5::delete_attribute(m_id, name); -} - -void bob::io::base::detail::hdf5::Group::read_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest_type, void* buffer) const { - bob::io::base::detail::hdf5::read_attribute(m_id, name, dest_type, buffer); -} - -void bob::io::base::detail::hdf5::Group::write_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest_type, const void* buffer) { - bob::io::base::detail::hdf5::write_attribute(m_id, name, dest_type, buffer); -} - -void bob::io::base::detail::hdf5::Group::list_attributes(std::map<std::string, bob::io::base::HDF5Type>& attributes) const { - bob::io::base::detail::hdf5::list_attributes(m_id, attributes); -} - -template <> void bob::io::base::detail::hdf5::Group::set_attribute<std::string>(const std::string& name, const std::string& v) { - bob::io::base::HDF5Type dest_type(v); - write_attribute(name, dest_type, reinterpret_cast<const void*>(v.c_str())); -} - -template <> std::string bob::io::base::detail::hdf5::Group::get_attribute(const std::string& name) const { - HDF5Type type; - gettype_attribute(name, type); - boost::shared_array<char> v(new char[type.shape()[0]+1]); - v[type.shape()[0]] = 0; ///< null termination - read_attribute(name, type, reinterpret_cast<void*>(v.get())); - std::string retval(v.get()); - return retval; -} - -bob::io::base::detail::hdf5::RootGroup::RootGroup(boost::shared_ptr<File> parent): - bob::io::base::detail::hdf5::Group(parent), - m_parent(parent) -{ -} - -bob::io::base::detail::hdf5::RootGroup::~RootGroup() { -} - -const std::string& bob::io::base::detail::hdf5::RootGroup::filename() const { - return m_parent.lock()->filename(); -} diff --git a/bob/io/base/cpp/HDF5Types.cpp b/bob/io/base/cpp/HDF5Types.cpp deleted file mode 100644 index 0f38566..0000000 --- a/bob/io/base/cpp/HDF5Types.cpp +++ /dev/null @@ -1,866 +0,0 @@ -/** - * @date Wed Jun 22 17:50:08 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief A few helpers to handle HDF5 datasets in a more abstract way. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> -#include <sstream> -#include <boost/make_shared.hpp> - -/** - * MT "lock" support was only introduced in Boost 1.35. Before copying this - * very ugly hack, make sure we are still using Boost 1.34. This will no longer - * be the case starting January 2011. - */ -#include <boost/version.hpp> -#include <boost/thread/mutex.hpp> -#if ((BOOST_VERSION / 100) % 1000) > 34 -#include <boost/thread/locks.hpp> -#else -#warning Disabling MT locks because Boost < 1.35! -#endif - -#include <bob.core/logging.h> - -#include <bob.io.base/HDF5Types.h> - -const char* bob::io::base::stringize (hdf5type t) { - switch (t) { - case bob::io::base::s: - return "string"; - case bob::io::base::b: - return "bool"; - case bob::io::base::i8: - return "int8"; - case bob::io::base::i16: - return "int16"; - case bob::io::base::i32: - return "int32"; - case bob::io::base::i64: - return "int64"; - case bob::io::base::u8: - return "uint8"; - case bob::io::base::u16: - return "uint16"; - case bob::io::base::u32: - return "uint32"; - case bob::io::base::u64: - return "uint64"; - case bob::io::base::f32: - return "float32"; - case bob::io::base::f64: - return "float64"; - case bob::io::base::f128: - return "float128"; - case bob::io::base::c64: - return "complex64"; - case bob::io::base::c128: - return "complex128"; - case bob::io::base::c256: - return "complex256"; - case bob::io::base::unsupported: - return "unsupported"; - } - return "unsupported"; ///< just to silence gcc -} - -static herr_t walker(unsigned n, const H5E_error2_t *desc, void *cookie) { - bob::io::base::HDF5ErrorStack& stack = *(bob::io::base::HDF5ErrorStack*)cookie; - std::vector<std::string>& sv = stack.get(); - boost::format fmt("%s() @ %s+%d: %s"); - fmt % desc->func_name % desc->file_name % desc->line % desc->desc; - sv.push_back(fmt.str()); - return 0; -} - -static herr_t err_callback(hid_t stack, void* cookie) { - bob::io::base::HDF5ErrorStack& err_stack = *(bob::io::base::HDF5ErrorStack*)cookie; - if (!err_stack.muted()) H5Ewalk2(stack, H5E_WALK_DOWNWARD, walker, cookie); - H5Eclear2(stack); - return 0; -} - -bob::io::base::HDF5ErrorStack::HDF5ErrorStack (): - m_stack(H5E_DEFAULT), - m_muted(false), - m_err(), - m_func(0), - m_client_data(0) -{ - H5Eget_auto2(m_stack, &m_func, &m_client_data); - H5Eset_auto2(m_stack, err_callback, this); -} - -bob::io::base::HDF5ErrorStack::HDF5ErrorStack (hid_t stack): - m_stack(stack), - m_muted(false), - m_err(), - m_func(0), - m_client_data(0) -{ - H5Eget_auto2(m_stack, &m_func, &m_client_data); - H5Eset_auto2(m_stack, err_callback, this); -} - -bob::io::base::HDF5ErrorStack::~HDF5ErrorStack () { - H5Eset_auto2(m_stack, m_func, m_client_data); -} - -//creates a pointer to the default HDF5 error stack that is global to the -//application level. -const boost::shared_ptr<bob::io::base::HDF5ErrorStack> - bob::io::base::DefaultHDF5ErrorStack(new HDF5ErrorStack()); - -bob::io::base::HDF5Shape::HDF5Shape (size_t n): - m_n(n), - m_shape() -{ - if (n > MAX_HDF5SHAPE_SIZE) { - boost::format m("cannot create shape with %u dimensions, exceeding the maximum number of dimensions supported by this API (%u)"); - m % n % MAX_HDF5SHAPE_SIZE; - throw std::runtime_error(m.str()); - } - for (size_t i=0; i<n; ++i) m_shape[i] = 0; -} - -bob::io::base::HDF5Shape::HDF5Shape (): - m_n(0), - m_shape() -{ -} - -bob::io::base::HDF5Shape::HDF5Shape (const bob::io::base::HDF5Shape& other): - m_n(other.m_n), - m_shape() -{ - for (size_t i=0; i<m_n; ++i) m_shape[i] = other.m_shape[i]; -} - -bob::io::base::HDF5Shape::~HDF5Shape() { -} - -bob::io::base::HDF5Shape& bob::io::base::HDF5Shape::operator= (const bob::io::base::HDF5Shape& other) { - m_n = other.m_n; - for (size_t i=0; i<m_n; ++i) m_shape[i] = other.m_shape[i]; - return *this; -} - -void bob::io::base::HDF5Shape::copy(const bob::io::base::HDF5Shape& other) { - if (m_n <= other.m_n) { //I'm smaller or equal - for (size_t i=0; i<m_n; ++i) m_shape[i] = other.m_shape[i]; - } - else { //The other is smaller - for (size_t i=0; i<other.m_n; ++i) m_shape[i] = other.m_shape[i]; - } -} - -void bob::io::base::HDF5Shape::reset() { - m_n = 0; -} - -bob::io::base::HDF5Shape& bob::io::base::HDF5Shape::operator <<= (size_t pos) { - if (!m_n || !pos) return *this; - for (size_t i=0; i<(m_n-pos); ++i) m_shape[i] = m_shape[i+pos]; - m_n -= pos; - return *this; -} - -bob::io::base::HDF5Shape& bob::io::base::HDF5Shape::operator >>= (size_t pos) { - if (!pos) return *this; - if ( (m_n + pos) > MAX_HDF5SHAPE_SIZE) { - boost::format m("if you shift right this shape by %u positions, you will exceed the maximum number of dimensions supported by this API (%u)"); - m % pos % MAX_HDF5SHAPE_SIZE; - throw std::runtime_error(m.str()); - } - for (size_t i=(m_n+pos-1); i>(pos-1); --i) m_shape[i] = m_shape[i-1]; - for (size_t i=0; i<pos; ++i) m_shape[i] = 1; - m_n += pos; - return *this; -} - -hsize_t bob::io::base::HDF5Shape::product() const { - hsize_t retval = 1; - for (size_t i=0; i<m_n; ++i) retval *= m_shape[i]; - return retval; -} - -bool bob::io::base::HDF5Shape::operator== (const HDF5Shape& other) const { - if (m_n != other.m_n) return false; - for (size_t i=0; i<m_n; ++i) if (m_shape[i] != other[i]) return false; - return true; -} - -bool bob::io::base::HDF5Shape::operator!= (const HDF5Shape& other) const { - return !(*this == other); -} - -std::string bob::io::base::HDF5Shape::str () const { - if (m_n == 0) return ""; - std::ostringstream retval(""); - retval << m_shape[0]; - for (size_t i=1; i<m_n; ++i) retval << ", " << m_shape[i]; - return retval.str(); -} - -/** - * Deleter method for auto-destroyable HDF5 datatypes. - */ -static void delete_h5datatype (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Tclose(*p); - if (err < 0) { - bob::core::error << "H5Tclose() exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -/** - * Given a datatype which is a compound type, returns the std::complex<T> - * hdf5type equivalent or raises. - */ -static bob::io::base::hdf5type equivctype(const boost::shared_ptr<hid_t>& dt) { - if (H5Tget_nmembers(*dt) != 2) throw std::runtime_error("the internal HDF5 type is not supported by our HDF5 interface"); - - //members have to: - // 1. have names "real" and "imag" - // 2. have class type H5T_FLOAT - // 3. have equal size - // 4. have a size of 4, 8 or 16 bytes - - // 1. - int real = H5Tget_member_index(*dt, "real"); - if (real < 0) { - throw std::runtime_error("the complex member index for `real' is not present on this HDF5 type"); - } - int imag = H5Tget_member_index(*dt, "imag"); - if (imag < 0) { - throw std::runtime_error("the complex member index for `imag' is not present on this HDF5 type"); - } - - // 2. - if (H5Tget_member_class(*dt, real) != H5T_FLOAT) - throw std::runtime_error("the raw type for member `real' on complex structure in HDF5 is not H5T_FLOAT as expected"); - if (H5Tget_member_class(*dt, imag) != H5T_FLOAT) - throw std::runtime_error("the raw type for member `imag' on complex structure in HDF5 is not H5T_FLOAT as expected"); - - // 3. - boost::shared_ptr<hid_t> realid(new hid_t(-1), std::ptr_fun(delete_h5datatype)); - *realid = H5Tget_member_type(*dt, real); - boost::shared_ptr<hid_t> imagid(new hid_t(-1), std::ptr_fun(delete_h5datatype)); - *imagid = H5Tget_member_type(*dt, imag); - size_t realsize = H5Tget_size(*realid); - size_t imagsize = H5Tget_size(*imagid); - if (realsize != imagsize) { - throw std::runtime_error("the sizes of the real and imaginary parts on HDF5 complex struct are not the same"); - } - - // 4. - switch (realsize) { - case 4: //std::complex<float> - return bob::io::base::c64; - case 8: //std::complex<double> - return bob::io::base::c128; - case 16: //std::complex<double> - return bob::io::base::c256; - default: - break; - } - - throw std::runtime_error("could not find the equivalent internal type for (supposedly) complex HDF5 structure"); -} - -/** - * Checks if a given type can be read as boolean - */ -static void checkbool(const boost::shared_ptr<hid_t>& dt) { - - if (H5Tget_nmembers(*dt) != 2) { - throw std::runtime_error("the number of enumeration members for the locally installed boolean type is not 2"); - } - - int8_t value; - herr_t status = H5Tget_member_value(*dt, 0, &value); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tget_member_value() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - bool next_is_false = false; - if (value != 0) next_is_false = true; - status = H5Tget_member_value(*dt, 1, &value); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tget_member_value() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - if (next_is_false) { - if (value != 0) { - throw std::runtime_error("the attribution of false(0) or true(1) is messed up on the current data type, which is supposed to be a boolean"); - } - } - else { - if (value == 0) { - throw std::runtime_error("the attribution of false(0) or true(1) is messed up on the current data type, which is supposed to be a boolean"); - } - } -} - -/** - * Given a datatype, returns the supported type equivalent or raises - */ -static bob::io::base::hdf5type get_datatype -(const boost::shared_ptr<hid_t>& dt) { - H5T_class_t classtype = H5Tget_class(*dt); - - if (classtype == H5T_STRING) return bob::io::base::s; //no need to check further - - size_t typesize = H5Tget_size(*dt); ///< element size - H5T_sign_t signtype = H5Tget_sign(*dt); - - //we only support little-endian byte-ordering - H5T_order_t ordertype = H5Tget_order(*dt); - - //please note that checking compound types for hdf5 < 1.8.6 does not work. -# if H5_VERSION_GE(1,8,6) - if (ordertype < 0) { - boost::format m("call to HDF5 C-function H5Tget_order returned error %d. HDF5 error statck follows:\n%s"); - m % ordertype % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - if (ordertype != H5T_ORDER_LE) { - throw std::runtime_error("The endianness of datatype is not little-endian"); - } -# else - if ((ordertype >= 0) && (ordertype != H5T_ORDER_LE)) { - throw std::runtime_error("The endianness of datatype is not little-endian"); - } -# endif - - switch (classtype) { - case H5T_ENUM: - checkbool(dt); - return bob::io::base::b; - case H5T_INTEGER: - switch (typesize) { - case 1: //int8 or uint8 - switch (signtype) { - case H5T_SGN_NONE: - return bob::io::base::u8; - case H5T_SGN_2: //two's complement == "is signed" ;-) - return bob::io::base::i8; - default: - throw std::runtime_error("HDF5 1-byte integer datatype (read from file) cannot be mapped into a C++ type supported by this API"); - } - break; - case 2: //int16 or uint16 - switch (signtype) { - case H5T_SGN_NONE: - return bob::io::base::u16; - case H5T_SGN_2: //two's complement == "is signed" ;-) - return bob::io::base::i16; - default: - throw std::runtime_error("HDF5 2-byte integer datatype (read from file) cannot be mapped into a C++ type supported by this API"); - } - break; - case 4: //int32 or uint32 - switch (signtype) { - case H5T_SGN_NONE: - return bob::io::base::u32; - case H5T_SGN_2: //two's complement == "is signed" ;-) - return bob::io::base::i32; - default: - throw std::runtime_error("HDF5 4-byte integer datatype (read from file) cannot be mapped into a C++ type supported by this API"); - } - break; - case 8: //int64 or uint64 - switch (signtype) { - case H5T_SGN_NONE: - return bob::io::base::u64; - case H5T_SGN_2: //two's complement == "is signed" ;-) - return bob::io::base::i64; - default: - throw std::runtime_error("HDF5 8-byte integer datatype (read from file) cannot be mapped into a C++ type supported by this API"); - } - break; - default: - break; - } - break; - case H5T_FLOAT: - switch (typesize) { - case 4: //float - return bob::io::base::f32; - case 8: //double - return bob::io::base::f64; - case 16: //long double - return bob::io::base::f128; - default: - break; - } - break; - case H5T_COMPOUND: //complex - return equivctype(dt); - default: - break; - } - - throw std::runtime_error("cannot handle HDF5 datatype on file using one of the native types supported by this API"); -} - -bool bob::io::base::HDF5Type::compatible (const bob::io::base::array::typeinfo& value) const -{ - return *this == HDF5Type(value); -} - -/** - * Given a datatype, returns the supported HDF5 datatype equivalent or -1 - */ -boost::shared_ptr<hid_t> bob::io::base::HDF5Type::htype() const { - switch (m_type) { - case bob::io::base::s: - { - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5datatype)); - *retval = H5Tcopy(H5T_C_S1); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Tcopy() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - //set string size - herr_t status = H5Tset_size(*retval, m_shape[0]); - if (status < 0) { - boost::format m("Call to HDF5 C-function H5Tset_size() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - return retval; - } - case bob::io::base::b: - { - //why? HDF5 is a C library and in C there is no boolean type - //bottom-line => we have to define our own... - - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5datatype)); - *retval = H5Tenum_create(H5T_NATIVE_INT8); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Tenum_create() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - int8_t val; - herr_t status; - - //defines false - val = 0; - status = H5Tenum_insert(*retval, "false", &val); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tenum_insert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - //defines true - val = 1; - status = H5Tenum_insert(*retval, "true", &val); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Tenum_insert() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - - return retval; - } - case bob::io::base::i8: - return boost::make_shared<hid_t>(H5T_NATIVE_INT8); - case bob::io::base::i16: - return boost::make_shared<hid_t>(H5T_NATIVE_INT16); - case bob::io::base::i32: - return boost::make_shared<hid_t>(H5T_NATIVE_INT32); - case bob::io::base::i64: - return boost::make_shared<hid_t>(H5T_NATIVE_INT64); - case bob::io::base::u8: - return boost::make_shared<hid_t>(H5T_NATIVE_UINT8); - case bob::io::base::u16: - return boost::make_shared<hid_t>(H5T_NATIVE_UINT16); - case bob::io::base::u32: - return boost::make_shared<hid_t>(H5T_NATIVE_UINT32); - case bob::io::base::u64: - return boost::make_shared<hid_t>(H5T_NATIVE_UINT64); - case bob::io::base::f32: - return boost::make_shared<hid_t>(H5T_NATIVE_FLOAT); - case bob::io::base::f64: - return boost::make_shared<hid_t>(H5T_NATIVE_DOUBLE); - case bob::io::base::f128: - return boost::make_shared<hid_t>(H5T_NATIVE_LDOUBLE); - case bob::io::base::c64: - { - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5datatype)); - *retval = H5Tcreate(H5T_COMPOUND, 2*sizeof(float)); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Tcreate() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - herr_t status = H5Tinsert(*retval, "real", 0, H5T_NATIVE_FLOAT); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tinsert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - status = H5Tinsert(*retval, "imag", sizeof(float), H5T_NATIVE_FLOAT); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tinsert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; - } - case bob::io::base::c128: - { - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5datatype)); - *retval = H5Tcreate(H5T_COMPOUND, 2*sizeof(double)); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Tcreate() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - herr_t status = H5Tinsert(*retval, "real", 0, H5T_NATIVE_DOUBLE); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tinsert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - status = H5Tinsert(*retval, "imag", sizeof(double), H5T_NATIVE_DOUBLE); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tinsert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; - } - case bob::io::base::c256: - { - boost::shared_ptr<hid_t> retval(new hid_t(-1), - std::ptr_fun(delete_h5datatype)); - *retval = H5Tcreate(H5T_COMPOUND, 2*sizeof(long double)); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Tcreate() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - herr_t status = H5Tinsert(*retval, "real", 0, H5T_NATIVE_LDOUBLE); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tinsert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - status = H5Tinsert(*retval, "imag", sizeof(long double), H5T_NATIVE_LDOUBLE); - if (status < 0) { - boost::format m("call to HDF5 C-function H5Tinsert() returned error %d. HDF5 error statck follows:\n%s"); - m % status % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; - } - default: - break; - } - throw std::runtime_error("the C++ type you are trying to convert into a native HDF5 type is not supported by this API"); -} - -#define DEFINE_SUPPORT(T,E) bob::io::base::HDF5Type::HDF5Type(const T& value): \ - m_type(E), m_shape(1) { m_shape[0] = 1; } -DEFINE_SUPPORT(bool,bob::io::base::b) -DEFINE_SUPPORT(int8_t,bob::io::base::i8) -DEFINE_SUPPORT(int16_t,bob::io::base::i16) -DEFINE_SUPPORT(int32_t,bob::io::base::i32) -DEFINE_SUPPORT(int64_t,bob::io::base::i64) -DEFINE_SUPPORT(uint8_t,bob::io::base::u8) -DEFINE_SUPPORT(uint16_t,bob::io::base::u16) -DEFINE_SUPPORT(uint32_t,bob::io::base::u32) -DEFINE_SUPPORT(uint64_t,bob::io::base::u64) -DEFINE_SUPPORT(float,bob::io::base::f32) -DEFINE_SUPPORT(double,bob::io::base::f64) -DEFINE_SUPPORT(long double,bob::io::base::f128) -DEFINE_SUPPORT(std::complex<float>,bob::io::base::c64) -DEFINE_SUPPORT(std::complex<double>,bob::io::base::c128) -DEFINE_SUPPORT(std::complex<long double>,bob::io::base::c256) -#undef DEFINE_SUPPORT - -bob::io::base::HDF5Type::HDF5Type(const char* value): - m_type(bob::io::base::s), - m_shape(1) -{ - m_shape[0] = std::strlen(value); -} - -bob::io::base::HDF5Type::HDF5Type(const std::string& value): - m_type(bob::io::base::s), - m_shape(1) -{ - m_shape[0] = value.size(); -} - -#define DEFINE_SUPPORT(T,E,N) bob::io::base::HDF5Type::HDF5Type \ - (const blitz::Array<T,N>& value): \ - m_type(E), \ - m_shape(value.shape()) { \ - if (N > bob::io::base::array::N_MAX_DIMENSIONS_ARRAY) {\ - boost::format m("you passed an array with %d dimensions, but this HDF5 API only supports arrays with up to %d dimensions"); \ - m % N % bob::io::base::array::N_MAX_DIMENSIONS_ARRAY; \ - throw std::runtime_error(m.str()); \ - } \ - } - -#define DEFINE_BZ_SUPPORT(T,E) \ - DEFINE_SUPPORT(T,E,1) \ - DEFINE_SUPPORT(T,E,2) \ - DEFINE_SUPPORT(T,E,3) \ - DEFINE_SUPPORT(T,E,4) - -DEFINE_BZ_SUPPORT(bool,bob::io::base::b) -DEFINE_BZ_SUPPORT(int8_t,bob::io::base::i8) -DEFINE_BZ_SUPPORT(int16_t,bob::io::base::i16) -DEFINE_BZ_SUPPORT(int32_t,bob::io::base::i32) -DEFINE_BZ_SUPPORT(int64_t,bob::io::base::i64) -DEFINE_BZ_SUPPORT(uint8_t,bob::io::base::u8) -DEFINE_BZ_SUPPORT(uint16_t,bob::io::base::u16) -DEFINE_BZ_SUPPORT(uint32_t,bob::io::base::u32) -DEFINE_BZ_SUPPORT(uint64_t,bob::io::base::u64) -DEFINE_BZ_SUPPORT(float,bob::io::base::f32) -DEFINE_BZ_SUPPORT(double,bob::io::base::f64) -DEFINE_BZ_SUPPORT(long double,bob::io::base::f128) -DEFINE_BZ_SUPPORT(std::complex<float>,bob::io::base::c64) -DEFINE_BZ_SUPPORT(std::complex<double>,bob::io::base::c128) -DEFINE_BZ_SUPPORT(std::complex<long double>,bob::io::base::c256) -#undef DEFINE_BZ_SUPPORT -#undef DEFINE_SUPPORT - -bob::io::base::HDF5Type::HDF5Type(): - m_type(bob::io::base::unsupported), - m_shape() -{ -} - -bob::io::base::HDF5Type::HDF5Type(bob::io::base::hdf5type type): - m_type(type), - m_shape(1) -{ - m_shape[0] = 1; -} - -bob::io::base::HDF5Type::HDF5Type(bob::io::base::hdf5type type, const bob::io::base::HDF5Shape& extents): - m_type(type), - m_shape(extents) -{ -} - -static bob::io::base::hdf5type array_to_hdf5 (bob::io::base::array::ElementType eltype) { - switch(eltype) { - case bob::io::base::array::t_unknown: - return bob::io::base::unsupported; - case bob::io::base::array::t_bool: - return bob::io::base::b; - case bob::io::base::array::t_int8: - return bob::io::base::i8; - case bob::io::base::array::t_int16: - return bob::io::base::i16; - case bob::io::base::array::t_int32: - return bob::io::base::i32; - case bob::io::base::array::t_int64: - return bob::io::base::i64; - case bob::io::base::array::t_uint8: - return bob::io::base::u8; - case bob::io::base::array::t_uint16: - return bob::io::base::u16; - case bob::io::base::array::t_uint32: - return bob::io::base::u32; - case bob::io::base::array::t_uint64: - return bob::io::base::u64; - case bob::io::base::array::t_float32: - return bob::io::base::f32; - case bob::io::base::array::t_float64: - return bob::io::base::f64; - case bob::io::base::array::t_float128: - return bob::io::base::f128; - case bob::io::base::array::t_complex64: - return bob::io::base::c64; - case bob::io::base::array::t_complex128: - return bob::io::base::c128; - case bob::io::base::array::t_complex256: - return bob::io::base::c256; - } - throw std::runtime_error("unsupported dtype <=> hdf5 type conversion -- FIXME"); -} - -bob::io::base::HDF5Type::HDF5Type(const bob::io::base::array::typeinfo& ti): - m_type(array_to_hdf5(ti.dtype)), - m_shape(ti.nd, ti.shape) -{ -} - -bob::io::base::HDF5Type::HDF5Type(bob::io::base::array::ElementType eltype, - const HDF5Shape& extents): - m_type(array_to_hdf5(eltype)), - m_shape(extents) -{ -} - -bob::io::base::HDF5Type::HDF5Type(const boost::shared_ptr<hid_t>& type, - const bob::io::base::HDF5Shape& extents): - m_type(get_datatype(type)), - m_shape(extents) -{ -} - -bob::io::base::HDF5Type::HDF5Type(const boost::shared_ptr<hid_t>& type): - m_type(get_datatype(type)), - m_shape(1) -{ - //strings have to be treated slightly differently - if (H5Tget_class(*type) == H5T_STRING) m_shape[0] = H5Tget_size(*type); - else m_shape[0] = 1; -} - -bob::io::base::HDF5Type::HDF5Type(const HDF5Type& other): - m_type(other.m_type), - m_shape(other.m_shape) -{ -} - -bob::io::base::HDF5Type::~HDF5Type() { } - -bob::io::base::HDF5Type& bob::io::base::HDF5Type::operator= (const bob::io::base::HDF5Type& other) -{ - m_type = other.m_type; - m_shape = other.m_shape; - return *this; -} - -bool bob::io::base::HDF5Type::operator== (const bob::io::base::HDF5Type& other) const { - return (m_type == other.m_type) && (m_shape == other.m_shape); -} - -bool bob::io::base::HDF5Type::operator!= (const bob::io::base::HDF5Type& other) const { - return !(*this == other); -} - -std::string bob::io::base::HDF5Type::str() const { - boost::format retval("%s (%s)"); - retval % bob::io::base::stringize(m_type) % m_shape.str(); - return retval.str(); -} - -bob::io::base::array::ElementType bob::io::base::HDF5Type::element_type() const { - switch (m_type) { - case b: - return bob::io::base::array::t_bool; - case i8: - return bob::io::base::array::t_int8; - case i16: - return bob::io::base::array::t_int16; - case i32: - return bob::io::base::array::t_int32; - case i64: - return bob::io::base::array::t_int64; - case u8: - return bob::io::base::array::t_uint8; - case u16: - return bob::io::base::array::t_uint16; - case u32: - return bob::io::base::array::t_uint32; - case u64: - return bob::io::base::array::t_uint64; - case f32: - return bob::io::base::array::t_float32; - case f64: - return bob::io::base::array::t_float64; - case f128: - return bob::io::base::array::t_float128; - case c64: - return bob::io::base::array::t_complex64; - case c128: - return bob::io::base::array::t_complex128; - case c256: - return bob::io::base::array::t_complex256; - case s: - throw std::runtime_error("Cannot convert HDF5 string type to an element type to be used in blitz::Array's - FIXME: something is wrong in the logic"); - default: - break; - } - return bob::io::base::array::t_unknown; -} - -void bob::io::base::HDF5Type::copy_to (bob::io::base::array::typeinfo& ti) const { - ti.dtype = element_type(); - ti.nd = shape().n(); - if (ti.nd > (BOB_MAX_DIM+1)) { - boost::format f("HDF5 type has more (%d) than the allowed maximum number of dimensions (%d)"); - f % ti.nd % (BOB_MAX_DIM+1); - throw std::runtime_error(f.str()); - } - for (size_t i=0; i<ti.nd; ++i) ti.shape[i] = shape()[i]; - ti.update_strides(); -} - -bob::io::base::HDF5Descriptor::HDF5Descriptor(const HDF5Type& type, size_t size, - bool expand): - type(type), - size(size), - expandable(expand), - hyperslab_start(type.shape().n()), - hyperslab_count(type.shape()) -{ -} - -bob::io::base::HDF5Descriptor::HDF5Descriptor(const HDF5Descriptor& other): - type(other.type), - size(other.size), - expandable(other.expandable), - hyperslab_start(other.hyperslab_start), - hyperslab_count(other.hyperslab_count) -{ -} - -bob::io::base::HDF5Descriptor::~HDF5Descriptor() { } - -bob::io::base::HDF5Descriptor& bob::io::base::HDF5Descriptor::operator= -(const bob::io::base::HDF5Descriptor& other) { - type = other.type; - size = other.size; - expandable = other.expandable; - hyperslab_start = other.hyperslab_start; - hyperslab_count = other.hyperslab_count; - return *this; -} - -bob::io::base::HDF5Descriptor& bob::io::base::HDF5Descriptor::subselect() { - hyperslab_start >>= 1; - hyperslab_count >>= 1; - hyperslab_count[0] = 1; - return *this; -} - -std::string bob::io::base::format_hdf5_error() { - const std::vector<std::string>& stack = bob::io::base::DefaultHDF5ErrorStack->get(); - std::ostringstream retval; - std::string prefix(" "); - if (stack.size()) retval << prefix << stack[0]; - for (size_t i=1; i<stack.size(); ++i) - retval << std::endl << prefix << stack[i]; - bob::io::base::DefaultHDF5ErrorStack->clear(); - return retval.str(); -} diff --git a/bob/io/base/cpp/HDF5Utils.cpp b/bob/io/base/cpp/HDF5Utils.cpp deleted file mode 100644 index 12c13ea..0000000 --- a/bob/io/base/cpp/HDF5Utils.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @date Wed Jun 22 17:50:08 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Implements a set of utilities to read HDF5 files. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> -#include <boost/make_shared.hpp> - -#include <bob.core/logging.h> - -#include <bob.io.base/HDF5Utils.h> - -/** - * Opens/Creates an "auto-destructible" HDF5 file - */ -static void delete_h5file (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Fclose(*p); - if (err < 0) { - bob::core::error << "H5Fclose(hid=" << *p << ") exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - } - } - delete p; -} - -/** - * Opens/Creates and "auto-destructible" HDF5 file creation property list - */ -static void delete_h5p (hid_t* p) { - if (*p >= 0) { - herr_t err = H5Pclose(*p); - if (err < 0) { - bob::core::error << "H5Pclose(hid=" << *p << ") exited with an error (" << err << "). The stack trace follows:" << std::endl; - bob::core::error << bob::io::base::format_hdf5_error() << std::endl; - return; - } - } - delete p; -} - -static boost::shared_ptr<hid_t> open_file(const boost::filesystem::path& path, - unsigned int flags, boost::shared_ptr<hid_t>& fcpl) { - - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5file)); - - if (!boost::filesystem::exists(path) && flags == H5F_ACC_RDONLY) { - //file was opened for reading, but does not exist... Raise - boost::format m("cannot open file `%s'"); - m % path.string(); - throw std::runtime_error(m.str()); - } - - if (boost::filesystem::exists(path) && flags != H5F_ACC_TRUNC) { //open - *retval = H5Fopen(path.string().c_str(), flags, H5P_DEFAULT); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Fopen() returned error %d on file '%s'. HDF5 error statck follows:\n%s"); - m % *retval % path.string().c_str() % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - //replaces the file create list properties with the one from the file - fcpl = boost::shared_ptr<hid_t>(new hid_t(-1), std::ptr_fun(delete_h5p)); - *fcpl = H5Fget_create_plist(*retval); - if (*fcpl < 0) { - boost::format m("call to HDF5 C-function H5Fget_create_list() returned error %d on file '%s'. HDF5 error statck follows:\n%s"); - m % *fcpl % path.string().c_str() % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - } - else { //file needs to be created or truncated (can set user block) - *retval = H5Fcreate(path.string().c_str(), H5F_ACC_TRUNC, - *fcpl, H5P_DEFAULT); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Fcreate() returned error %d on file '%s'. HDF5 error statck follows:\n%s"); - m % *retval % path.string().c_str() % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - } - return retval; -} - -static boost::shared_ptr<hid_t> create_fcpl(hsize_t userblock_size) { - if (!userblock_size) return boost::make_shared<hid_t>(H5P_DEFAULT); - //otherwise we have to go through the settings - boost::shared_ptr<hid_t> retval(new hid_t(-1), std::ptr_fun(delete_h5p)); - *retval = H5Pcreate(H5P_FILE_CREATE); - if (*retval < 0) { - boost::format m("call to HDF5 C-function H5Pcreate() returned error %d. HDF5 error statck follows:\n%s"); - m % *retval % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - herr_t err = H5Pset_userblock(*retval, userblock_size); - if (err < 0) { - boost::format m("call to HDF5 C-function H5Pset_userblock() returned error %d. HDF5 error statck follows:\n%s"); - m % err % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; -} - -bob::io::base::detail::hdf5::File::File(const boost::filesystem::path& path, unsigned int flags, - size_t userblock_size): - m_path(path), - m_flags(flags), - m_fcpl(create_fcpl(userblock_size)), - m_id(open_file(m_path, m_flags, m_fcpl)) -{ -} - -bob::io::base::detail::hdf5::File::~File() { -} - -boost::shared_ptr<bob::io::base::detail::hdf5::RootGroup> bob::io::base::detail::hdf5::File::root() { - if (!m_root) { - m_root = boost::make_shared<bob::io::base::detail::hdf5::RootGroup>(shared_from_this()); - m_root->open_recursively(); - } - return m_root; -} - -void bob::io::base::detail::hdf5::File::reset() { - m_root.reset(); -} - -void bob::io::base::detail::hdf5::File::flush() { - herr_t err = H5Fflush(*m_id, H5F_SCOPE_GLOBAL); - if (err < 0){ - std::runtime_error("H5Fflush returned with an error code."); - } -} - -bool bob::io::base::detail::hdf5::File::writable() const { - return (m_flags != H5F_ACC_RDONLY); -} - -size_t bob::io::base::detail::hdf5::File::userblock_size() const { - hsize_t retval; - herr_t err = H5Pget_userblock(*m_fcpl, &retval); - if (err < 0) { - boost::format m("Call to HDF5 C-function H5Pget_create_plist() returned error %d. HDF5 error statck follows:\n%s"); - m % err % bob::io::base::format_hdf5_error(); - throw std::runtime_error(m.str()); - } - return retval; -} - -void bob::io::base::detail::hdf5::File::get_userblock(std::string& data) const { - //TODO -} - -void bob::io::base::detail::hdf5::File::set_userblock(const std::string& data) { - //TODO -} diff --git a/bob/io/base/cpp/array.cpp b/bob/io/base/cpp/array.cpp deleted file mode 100644 index 2ffc94d..0000000 --- a/bob/io/base/cpp/array.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @date Tue Nov 8 15:34:31 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Some buffer stuff - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> -#include <bob.io.base/array.h> - -bob::io::base::array::typeinfo::typeinfo(): - dtype(bob::io::base::array::t_unknown), - nd(0) -{ -} - -bob::io::base::array::typeinfo::typeinfo(const bob::io::base::array::typeinfo& other): - dtype(other.dtype) -{ - set_shape(other.nd, other.shape); -} - -bob::io::base::array::typeinfo& bob::io::base::array::typeinfo::operator= (const bob::io::base::array::typeinfo& other) { - dtype = other.dtype; - set_shape(other.nd, other.shape); - return *this; -} - -void bob::io::base::array::typeinfo::reset() { - dtype = bob::io::base::array::t_unknown; - nd = 0; -} - -bool bob::io::base::array::typeinfo::is_valid() const { - return (dtype != bob::io::base::array::t_unknown) && (nd > 0) && (nd <= (BOB_MAX_DIM+1)) && has_valid_shape(); -} - -void bob::io::base::array::typeinfo::update_strides() { - switch (nd) { - case 0: - return; - case 1: - stride[0] = 1; - return; - case 2: - stride[1] = 1; - stride[0] = shape[1]; - return; - case 3: - stride[2] = 1; - stride[1] = shape[2]; - stride[0] = shape[1]*shape[2]; - return; - case 4: - stride[3] = 1; - stride[2] = shape[3]; - stride[1] = shape[2]*shape[3]; - stride[0] = shape[1]*shape[2]*shape[3]; - return; - case 5: - stride[4] = 1; - stride[3] = shape[4]; - stride[2] = shape[3]*shape[4]; - stride[1] = shape[2]*shape[3]*shape[4]; - stride[0] = shape[1]*shape[2]*shape[3]*shape[4]; - return; - default: - break; - } - throw std::runtime_error("unsupported number of dimensions"); -} - -size_t bob::io::base::array::typeinfo::size() const { - size_t retval = 1; - for (size_t k=0; k<nd; ++k) retval *= shape[k]; - return retval; -} - -size_t bob::io::base::array::typeinfo::buffer_size() const { - return size()*bob::io::base::array::getElementSize(dtype); -} - -static bool same_shape(size_t nd, const size_t* s1, const size_t* s2) { - for (size_t k=0; k<nd; ++k) if (s1[k] != s2[k]) return false; - return true; -} - -bool bob::io::base::array::typeinfo::is_compatible(const bob::io::base::array::typeinfo& other) const { - return (dtype == other.dtype) && (nd == other.nd) && same_shape(nd, shape, other.shape); -} - -std::string bob::io::base::array::typeinfo::str() const { - boost::format s("dtype: %s (%d); shape: [%s]; size: %d bytes"); - size_t sz = 0; - size_t buf_sz = 0; - if (dtype != bob::io::base::array::t_unknown) { - //otherwise it throws - sz = item_size(); - buf_sz = buffer_size(); - } - s % item_str() % sz; - switch (nd) { - case 0: - s % ""; - break; - case 1: - s % (boost::format("%d") % shape[0]).str(); - break; - case 2: - s % (boost::format("%d,%d") % shape[0] % shape[1]).str(); - break; - case 3: - s % (boost::format("%d,%d,%d") % shape[0] % shape[1] % shape[2]).str(); - break; - case 4: - s % (boost::format("%d,%d,%d,%d") % shape[0] % shape[1] % shape[2] % shape[3]).str(); - break; - default: - s % ">4 dimensions?"; - break; - } - s % buf_sz; - return s.str(); -} - -void bob::io::base::array::typeinfo::reset_shape() { - shape[0] = 0; -} - -bool bob::io::base::array::typeinfo::has_valid_shape() const { - return shape[0] != 0; -} diff --git a/bob/io/base/cpp/array_type.cpp b/bob/io/base/cpp/array_type.cpp deleted file mode 100644 index d42368e..0000000 --- a/bob/io/base/cpp/array_type.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @date Sat Apr 9 18:10:10 2011 +0200 - * @author Laurent El Shafey <Laurent.El-Shafey@idiap.ch> - * - * @brief Some type-related array utilities - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <bob.io.base/array_type.h> -#include <boost/format.hpp> - -static const char* t_bool_string = "bool"; -static const char* t_int8_string = "int8"; -static const char* t_int16_string = "int16"; -static const char* t_int32_string = "int32"; -static const char* t_int64_string = "int64"; -static const char* t_uint8_string = "uint8"; -static const char* t_uint16_string = "uint16"; -static const char* t_uint32_string = "uint32"; -static const char* t_uint64_string = "uint64"; -static const char* t_float32_string = "float32"; -static const char* t_float64_string = "float64"; -static const char* t_float128_string = "float128"; -static const char* t_complex64_string = "complex64"; -static const char* t_complex128_string = "complex128"; -static const char* t_complex256_string = "complex256"; -static const char* t_unknown_string = "unknown"; - -size_t bob::io::base::array::getElementSize(ElementType t) { - switch(t) { - case bob::io::base::array::t_bool: - return sizeof(bool); - case bob::io::base::array::t_int8: - return sizeof(int8_t); - case bob::io::base::array::t_int16: - return sizeof(int16_t); - case bob::io::base::array::t_int32: - return sizeof(int32_t); - case bob::io::base::array::t_int64: - return sizeof(int64_t); - case bob::io::base::array::t_uint8: - return sizeof(uint8_t); - case bob::io::base::array::t_uint16: - return sizeof(uint16_t); - case bob::io::base::array::t_uint32: - return sizeof(uint32_t); - case bob::io::base::array::t_uint64: - return sizeof(uint64_t); - case bob::io::base::array::t_float32: - return sizeof(float); - case bob::io::base::array::t_float64: - return sizeof(double); - case bob::io::base::array::t_float128: - return sizeof(long double); - case bob::io::base::array::t_complex64: - return sizeof(std::complex<float>); - case bob::io::base::array::t_complex128: - return sizeof(std::complex<double>); - case bob::io::base::array::t_complex256: - return sizeof(std::complex<long double>); - default: - { - boost::format m("unsupported element type (%d)"); - m % (int)t; - throw std::runtime_error(m.str()); - } - } -} - -const char* bob::io::base::array::stringize(ElementType t) { - switch(t) { - case bob::io::base::array::t_bool: - return t_bool_string; - case bob::io::base::array::t_int8: - return t_int8_string; - case bob::io::base::array::t_int16: - return t_int16_string; - case bob::io::base::array::t_int32: - return t_int32_string; - case bob::io::base::array::t_int64: - return t_int64_string; - case bob::io::base::array::t_uint8: - return t_uint8_string; - case bob::io::base::array::t_uint16: - return t_uint16_string; - case bob::io::base::array::t_uint32: - return t_uint32_string; - case bob::io::base::array::t_uint64: - return t_uint64_string; - case bob::io::base::array::t_float32: - return t_float32_string; - case bob::io::base::array::t_float64: - return t_float64_string; - case bob::io::base::array::t_float128: - return t_float128_string; - case bob::io::base::array::t_complex64: - return t_complex64_string; - case bob::io::base::array::t_complex128: - return t_complex128_string; - case bob::io::base::array::t_complex256: - return t_complex256_string; - default: - return t_unknown_string; - } -} - -bob::io::base::array::ElementType bob::io::base::array::unstringize(const char* s) { - std::string sc(s); - if (sc == t_bool_string) return bob::io::base::array::t_bool; - if (sc == t_int8_string) return bob::io::base::array::t_int8; - if (sc == t_int16_string) return bob::io::base::array::t_int16; - if (sc == t_int32_string) return bob::io::base::array::t_int32; - if (sc == t_int64_string) return bob::io::base::array::t_int64; - if (sc == t_uint8_string) return bob::io::base::array::t_uint8; - if (sc == t_uint16_string) return bob::io::base::array::t_uint16; - if (sc == t_uint32_string) return bob::io::base::array::t_uint32; - if (sc == t_uint64_string) return bob::io::base::array::t_uint64; - if (sc == t_float32_string) return bob::io::base::array::t_float32; - if (sc == t_float64_string) return bob::io::base::array::t_float64; - if (sc == t_float128_string) return bob::io::base::array::t_float128; - if (sc == t_complex64_string) return bob::io::base::array::t_complex64; - if (sc == t_complex128_string) return bob::io::base::array::t_complex128; - if (sc == t_complex256_string) return bob::io::base::array::t_complex256; - return bob::io::base::array::t_unknown; -} diff --git a/bob/io/base/cpp/blitz_array.cpp b/bob/io/base/cpp/blitz_array.cpp deleted file mode 100644 index 2bc723a..0000000 --- a/bob/io/base/cpp/blitz_array.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/** - * @date Tue Nov 8 15:34:31 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Implementation of non-templated methods of the blitz - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <stdexcept> - -#include <bob.io.base/blitz_array.h> - -bob::io::base::array::blitz_array::blitz_array(boost::shared_ptr<blitz_array> other) { - set(other); -} - -bob::io::base::array::blitz_array::blitz_array(const blitz_array& other) { - set(other); -} - -bob::io::base::array::blitz_array::blitz_array(boost::shared_ptr<interface> other) { - set(other); -} - -bob::io::base::array::blitz_array::blitz_array(const interface& other) { - set(other); -} - -bob::io::base::array::blitz_array::blitz_array(const typeinfo& info) { - set(info); -} - -bob::io::base::array::blitz_array::blitz_array(void* data, const typeinfo& info): - m_type(info), - m_ptr(data), - m_is_blitz(false) { -} - -bob::io::base::array::blitz_array::~blitz_array() { -} - -void bob::io::base::array::blitz_array::set(boost::shared_ptr<blitz_array> other) { - m_type = other->m_type; - m_ptr = other->m_ptr; - m_is_blitz = other->m_is_blitz; - m_data = other->m_data; -} - -void bob::io::base::array::blitz_array::set(const interface& other) { - set(other.type()); - memcpy(m_ptr, other.ptr(), m_type.buffer_size()); -} - -void bob::io::base::array::blitz_array::set(boost::shared_ptr<interface> other) { - m_type = other->type(); - m_ptr = other->ptr(); - m_is_blitz = false; - m_data = other; -} - -template <typename T> -static boost::shared_ptr<void> make_array(size_t nd, const size_t* shape, - void*& ptr) { - switch(nd) { - case 1: - { - blitz::TinyVector<int,1> tv_shape; - for (size_t k=0; k<nd; ++k) tv_shape[k] = shape[k]; - boost::shared_ptr<void> retval = - boost::make_shared<blitz::Array<T,1> >(tv_shape); - ptr = reinterpret_cast<void*>(boost::static_pointer_cast<blitz::Array<T,1> >(retval)->data()); - return retval; - } - case 2: - { - blitz::TinyVector<int,2> tv_shape; - for (size_t k=0; k<nd; ++k) tv_shape[k] = shape[k]; - boost::shared_ptr<void> retval = - boost::make_shared<blitz::Array<T,2> >(tv_shape); - ptr = reinterpret_cast<void*>(boost::static_pointer_cast<blitz::Array<T,2> >(retval)->data()); - return retval; - } - case 3: - { - blitz::TinyVector<int,3> tv_shape; - for (size_t k=0; k<nd; ++k) tv_shape[k] = shape[k]; - boost::shared_ptr<void> retval = - boost::make_shared<blitz::Array<T,3> >(tv_shape); - ptr = reinterpret_cast<void*>(boost::static_pointer_cast<blitz::Array<T,3> >(retval)->data()); - return retval; - } - case 4: - { - blitz::TinyVector<int,4> tv_shape; - for (size_t k=0; k<nd; ++k) tv_shape[k] = shape[k]; - boost::shared_ptr<void> retval = - boost::make_shared<blitz::Array<T,4> >(tv_shape); - ptr = reinterpret_cast<void*>(boost::static_pointer_cast<blitz::Array<T,4> >(retval)->data()); - return retval; - } - default: - break; - } - throw std::runtime_error("unsupported number of dimensions -- debug me"); -} - -void bob::io::base::array::blitz_array::set (const bob::io::base::array::typeinfo& req) { - if (m_type.is_compatible(req)) return; ///< double-check requirement first! - - //ok, have to go through reallocation - m_type = req; - m_is_blitz = true; - switch (m_type.dtype) { - case bob::io::base::array::t_bool: - m_data = make_array<bool>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_int8: - m_data = make_array<int8_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_int16: - m_data = make_array<int16_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_int32: - m_data = make_array<int32_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_int64: - m_data = make_array<int64_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_uint8: - m_data = make_array<uint8_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_uint16: - m_data = make_array<uint16_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_uint32: - m_data = make_array<uint32_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_uint64: - m_data = make_array<uint64_t>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_float32: - m_data = make_array<float>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_float64: - m_data = make_array<double>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_float128: - m_data = make_array<long double>(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_complex64: - m_data = make_array<std::complex<float> >(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_complex128: - m_data = make_array<std::complex<double> >(req.nd, req.shape, m_ptr); - return; - case bob::io::base::array::t_complex256: - m_data = make_array<std::complex<long double> >(req.nd, req.shape, m_ptr); - return; - default: - break; - } - - //if we get to this point, there is nothing much we can do... - throw std::runtime_error("invalid data type on blitz array reset -- debug me"); -} diff --git a/bob/io/base/cpp/reorder.cpp b/bob/io/base/cpp/reorder.cpp deleted file mode 100644 index cda5ab3..0000000 --- a/bob/io/base/cpp/reorder.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/** - * @date Tue Nov 22 11:24:44 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Implementation of row-major/column-major reordering - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <boost/format.hpp> -#include <cstring> //for memcpy - -#include <bob.io.base/reorder.h> - -void bob::io::base::rc2d(size_t& row, size_t& col, const size_t i, const size_t j, - const size_t* shape) { - row = (i * shape[1]) + j; - col = (j * shape[0]) + i; -} - -void bob::io::base::rc3d(size_t& row, size_t& col, const size_t i, const size_t j, - const size_t k, const size_t* shape) { - row = ( (i * shape[1]) + j ) * shape[2] + k; - col = ( (k * shape[1]) + j ) * shape[0] + i; -} - -void bob::io::base::rc4d(size_t& row, size_t& col, const size_t i, const size_t j, - const size_t k, const size_t l, const size_t* shape) { - row = ( ( i * shape[1] + j ) * shape[2] + k ) * shape[3] + l; - col = ( ( l * shape[2] + k ) * shape[1] + j ) * shape[0] + i; -} - -void bob::io::base::row_to_col_order(const void* src_, void* dst_, - const bob::io::base::array::typeinfo& info) { - - size_t dsize = info.item_size(); - - //cast to byte type so we can manipulate the pointers... - const uint8_t* src = static_cast<const uint8_t*>(src_); - uint8_t* dst = static_cast<uint8_t*>(dst_); - - switch(info.nd) { - - case 1: - std::memcpy(dst, src, info.buffer_size()); - break; - - case 2: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) { - size_t row_major, col_major; - bob::io::base::rc2d(row_major, col_major, i, j, info.shape); - row_major *= dsize; - col_major *= dsize; - std::memcpy(&dst[col_major], &src[row_major], dsize); - } - break; - - case 3: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) { - size_t row_major, col_major; - bob::io::base::rc3d(row_major, col_major, i, j, k, info.shape); - row_major *= dsize; - col_major *= dsize; - std::memcpy(&dst[col_major], &src[row_major], dsize); - } - break; - - case 4: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) - for (size_t l=0; l<info.shape[3]; ++l) { - size_t row_major, col_major; - bob::io::base::rc4d(row_major, col_major, i, j, k, l, info.shape); - row_major *= dsize; - col_major *= dsize; - std::memcpy(&dst[col_major], &src[row_major], dsize); - } - break; - - default: - { - boost::format m("row_to_col_order() can only flip arrays with up to %u dimensions - you passed one with %u dimensions"); - m % BOB_MAX_DIM % info.nd; - throw std::runtime_error(m.str()); - } - } -} - -void bob::io::base::col_to_row_order(const void* src_, void* dst_, - const bob::io::base::array::typeinfo& info) { - - size_t dsize = info.item_size(); - - //cast to byte type so we can manipulate the pointers... - const uint8_t* src = static_cast<const uint8_t*>(src_); - uint8_t* dst = static_cast<uint8_t*>(dst_); - - switch(info.nd) { - - case 1: - std::memcpy(dst, src, info.buffer_size()); - break; - - case 2: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) { - size_t row_major, col_major; - bob::io::base::rc2d(row_major, col_major, i, j, info.shape); - row_major *= dsize; - col_major *= dsize; - std::memcpy(&dst[row_major], &src[col_major], dsize); - } - break; - - case 3: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) { - size_t row_major, col_major; - bob::io::base::rc3d(row_major, col_major, i, j, k, info.shape); - row_major *= dsize; - col_major *= dsize; - std::memcpy(&dst[row_major], &src[col_major], dsize); - } - break; - - case 4: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) - for (size_t l=0; l<info.shape[3]; ++l) { - size_t row_major, col_major; - bob::io::base::rc4d(row_major, col_major, i, j, k, l, info.shape); - row_major *= dsize; - col_major *= dsize; - std::memcpy(&dst[row_major], &src[col_major], dsize); - } - break; - - default: - { - boost::format m("col_to_row_order() can only flip arrays with up to %u dimensions - you passed one with %u dimensions"); - m % BOB_MAX_DIM % info.nd; - throw std::runtime_error(m.str()); - } - } -} - -void bob::io::base::row_to_col_order_complex(const void* src_, void* dst_re_, - void* dst_im_, const bob::io::base::array::typeinfo& info) { - - size_t dsize = info.item_size(); - size_t dsize2 = dsize/2; ///< size of each complex component (real, imaginary) - - //cast to byte type so we can manipulate the pointers... - const uint8_t* src = static_cast<const uint8_t*>(src_); - uint8_t* dst_re = static_cast<uint8_t*>(dst_re_); - uint8_t* dst_im = static_cast<uint8_t*>(dst_im_); - - switch(info.nd) { - - case 1: - for (size_t i=0; i<info.shape[0]; ++i) { - std::memcpy(&dst_re[dsize2*i], &src[dsize*i] , dsize2); - std::memcpy(&dst_im[dsize2*i], &src[dsize*i]+dsize2, dsize2); - } - break; - - case 2: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) { - size_t row_major, col_major; - bob::io::base::rc2d(row_major, col_major, i, j, info.shape); - row_major *= dsize; - col_major *= dsize2; - std::memcpy(&dst_re[col_major], &src[row_major] , dsize2); - std::memcpy(&dst_im[col_major], &src[row_major]+dsize2, dsize2); - } - break; - - case 3: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) { - size_t row_major, col_major; - bob::io::base::rc3d(row_major, col_major, i, j, k, info.shape); - row_major *= dsize; - col_major *= dsize2; - std::memcpy(&dst_re[col_major], &src[row_major] , dsize2); - std::memcpy(&dst_im[col_major], &src[row_major]+dsize2, dsize2); - } - break; - - case 4: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) - for (size_t l=0; l<info.shape[3]; ++l) { - size_t row_major, col_major; - bob::io::base::rc4d(row_major, col_major, i, j, k, l, info.shape); - row_major *= dsize; - col_major *= dsize2; - std::memcpy(&dst_re[col_major], &src[row_major] , dsize2); - std::memcpy(&dst_im[col_major], &src[row_major]+dsize2, dsize2); - } - break; - - default: - { - boost::format m("row_to_col_order_complex() can only flip arrays with up to %u dimensions - you passed one with %u dimensions"); - m % BOB_MAX_DIM % info.nd; - throw std::runtime_error(m.str()); - } - } -} - -void bob::io::base::col_to_row_order_complex(const void* src_re_, const void* src_im_, - void* dst_, const bob::io::base::array::typeinfo& info) { - - size_t dsize = info.item_size(); - size_t dsize2 = dsize/2; ///< size of each complex component (real, imaginary) - - //cast to byte type so we can manipulate the pointers... - const uint8_t* src_re = static_cast<const uint8_t*>(src_re_); - const uint8_t* src_im = static_cast<const uint8_t*>(src_im_); - uint8_t* dst = static_cast<uint8_t*>(dst_); - - switch(info.nd) { - - case 1: - for (size_t i=0; i<info.shape[0]; ++i) { - std::memcpy(&dst[dsize*i] , &src_re[dsize2*i], dsize2); - std::memcpy(&dst[dsize*i]+dsize2, &src_im[dsize2*i], dsize2); - } - break; - - case 2: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) { - size_t row_major, col_major; - bob::io::base::rc2d(row_major, col_major, i, j, info.shape); - row_major *= dsize; - col_major *= dsize2; - std::memcpy(&dst[row_major], &src_re[col_major], dsize2); - std::memcpy(&dst[row_major]+dsize2, &src_im[col_major], dsize2); - } - break; - - case 3: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) { - size_t row_major, col_major; - bob::io::base::rc3d(row_major, col_major, i, j, k, info.shape); - row_major *= dsize; - col_major *= dsize2; - std::memcpy(&dst[row_major] , &src_re[col_major], dsize2); - std::memcpy(&dst[row_major]+dsize2, &src_im[col_major], dsize2); - } - break; - - case 4: - for (size_t i=0; i<info.shape[0]; ++i) - for (size_t j=0; j<info.shape[1]; ++j) - for (size_t k=0; k<info.shape[2]; ++k) - for (size_t l=0; l<info.shape[3]; ++l) { - size_t row_major, col_major; - bob::io::base::rc4d(row_major, col_major, i, j, k, l, info.shape); - row_major *= dsize; - col_major *= dsize2; - std::memcpy(&dst[row_major] , &src_re[col_major], dsize2); - std::memcpy(&dst[row_major]+dsize2, &src_im[col_major], dsize2); - } - break; - - default: - { - boost::format m("col_to_row_order_complex() can only flip arrays with up to %u dimensions - you passed one with %u dimensions"); - m % BOB_MAX_DIM % info.nd; - throw std::runtime_error(m.str()); - } - } -} - diff --git a/bob/io/base/cpp/utils.cpp b/bob/io/base/cpp/utils.cpp deleted file mode 100644 index 3467b99..0000000 --- a/bob/io/base/cpp/utils.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 3 Oct 08:36:48 2012 - * - * @brief Implementation of some compile-time I/O utitlites - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#include <bob.io.base/CodecRegistry.h> -#include <bob.io.base/utils.h> - -boost::shared_ptr<bob::io::base::File> bob::io::base::open (const char* filename, - char mode, const char* pretend_extension) { - boost::shared_ptr<bob::io::base::CodecRegistry> instance = bob::io::base::CodecRegistry::instance(); - return instance->findByExtension(pretend_extension)(filename, mode); -} - -boost::shared_ptr<bob::io::base::File> bob::io::base::open (const char* filename, char mode) { - boost::shared_ptr<bob::io::base::CodecRegistry> instance = bob::io::base::CodecRegistry::instance(); - return instance->findByFilenameExtension(filename)(filename, mode); -} - -bob::io::base::array::typeinfo bob::io::base::peek (const char* filename) { - return open(filename, 'r')->type(); -} - -bob::io::base::array::typeinfo bob::io::base::peek_all (const char* filename) { - return open(filename, 'r')->type_all(); -} diff --git a/bob/io/base/file.cpp b/bob/io/base/file.cpp deleted file mode 100644 index fc2622a..0000000 --- a/bob/io/base/file.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Tue 5 Nov 11:16:09 2013 - * - * @brief Bindings to bob::io::base::File - */ - -#define BOB_IO_BASE_MODULE -#include "bobskin.h" -#include <bob.io.base/api.h> -#include <numpy/arrayobject.h> -#include <bob.blitz/capi.h> -#include <bob.blitz/cleanup.h> -#include <bob.extension/documentation.h> -#include <stdexcept> - -#include <bob.io.base/CodecRegistry.h> -#include <bob.io.base/utils.h> - -/* Creates an exception message including the name of the given file, if possible */ -inline const std::string exception_message(PyBobIoFileObject* self, const std::string& name){ - std::ostringstream str; - str << name << " ("; - try{ - str << "'" << self->f->filename() << "'"; - } catch (...){ - str << "<unkown>"; - } - str << ")"; - return str.str(); -} - -static auto s_file = bob::extension::ClassDoc( - "File", - "Use this object to read and write data into files" -) -.add_constructor( - bob::extension::FunctionDoc( - "File", - "Opens a file for reading or writing", - "Normally, we read the file matching the extension to one of the available codecs installed with the present release of Bob. " - "If you set the ``pretend_extension`` parameter though, we will read the file as it had a given extension. " - "The value should start with a ``'.'``. " - "For example ``'.hdf5'``, to make the file be treated like an HDF5 file.", - true - ) - .add_prototype("filename, [mode], [pretend_extension]", "") - .add_parameter("filename", "str", "The file path to the file you want to open") - .add_parameter("mode", "one of ('r', 'w', 'a')", "[Default: ``'r'``] A single character indicating if you'd like to ``'r'``\\ ead, ``'w'``\\ rite or ``'a'``\\ ppend into the file; if you choose ``'w'`` and the file already exists, it will be truncated") - .add_parameter("pretend_extension", "str", "[optional] An extension to use; see :py:func:`bob.io.base.extensions` for a list of (currently) supported extensions") -); -/* How to create a new PyBobIoFileObject */ -static PyObject* PyBobIoFile_New(PyTypeObject* type, PyObject*, PyObject*) { - - /* Allocates the python object itself */ - PyBobIoFileObject* self = (PyBobIoFileObject*)type->tp_alloc(type, 0); - - self->f.reset(); - - return reinterpret_cast<PyObject*>(self); -} - -static void PyBobIoFile_Delete (PyBobIoFileObject* o) { - - o->f.reset(); - Py_TYPE(o)->tp_free((PyObject*)o); - -} - -int PyBobIo_FilenameConverter (PyObject* o, const char** b) { -#if PY_VERSION_HEX >= 0x03000000 - if (PyUnicode_Check(o)) { - *b = PyUnicode_AsUTF8(o); - } else { - PyObject* temp = PyObject_Bytes(o); - if (!temp) return 0; - auto temp_ = make_safe(temp); - *b = PyBytes_AsString(temp); - } -#else - if (PyUnicode_Check(o)) { - PyObject* temp = PyUnicode_AsEncodedString(o, Py_FileSystemDefaultEncoding, "strict"); - if (!temp) return 0; - auto temp_ = make_safe(temp); - *b = PyString_AsString(temp); - } else { - *b = PyString_AsString(o); - } -#endif - return b != 0; -} - -/* The __init__(self) method */ -static int PyBobIoFile_init(PyBobIoFileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_file.kwlist(); - - const char* filename; - const char* pretend_extension = 0; - -#if PY_VERSION_HEX >= 0x03000000 -# define MODE_CHAR "C" - int mode = 'r'; -#else -# define MODE_CHAR "c" - char mode = 'r'; -#endif - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|" MODE_CHAR "s", kwlist, - &PyBobIo_FilenameConverter, &filename, &mode, &pretend_extension)) return -1; - -#undef MODE_CHAR - - if (mode != 'r' && mode != 'w' && mode != 'a') { - PyErr_Format(PyExc_ValueError, "file open mode string should have 1 element and be either 'r' (read), 'w' (write) or 'a' (append)"); - return -1; - } - - if (pretend_extension) { - self->f = bob::io::base::open(filename, mode, pretend_extension); - } - else { - self->f = bob::io::base::open(filename, mode); - } - - return 0; ///< SUCCESS -BOB_CATCH_MEMBER("constructor", -1); -} - -static PyObject* PyBobIoFile_repr(PyBobIoFileObject* self) { - return PyString_FromFormat("%s(filename='%s', codec='%s')", Py_TYPE(self)->tp_name, self->f->filename(), self->f->name()); -} - -static auto s_filename = bob::extension::VariableDoc( - "filename", - "str", - "The path to the file being read/written" -); -static PyObject* PyBobIoFile_Filename(PyBobIoFileObject* self) { - return Py_BuildValue("s", self->f->filename()); -} - -static auto s_codec_name = bob::extension::VariableDoc( - "codec_name", - "str", - "Name of the File class implementation", - "This variable is available for compatibility reasons with the previous versions of this library." -); -static PyObject* PyBobIoFile_CodecName(PyBobIoFileObject* self) { - return Py_BuildValue("s", self->f->name()); -} - - -static PyGetSetDef PyBobIoFile_getseters[] = { - { - s_filename.name(), - (getter)PyBobIoFile_Filename, - 0, - s_filename.doc(), - 0, - }, - { - s_codec_name.name(), - (getter)PyBobIoFile_CodecName, - 0, - s_codec_name.doc(), - 0, - }, - {0} /* Sentinel */ -}; - -static Py_ssize_t PyBobIoFile_len (PyBobIoFileObject* self) { - Py_ssize_t retval = self->f->size(); - return retval; -} - -int PyBobIo_AsTypenum (bob::io::base::array::ElementType type) { - - switch(type) { - case bob::io::base::array::t_bool: - return NPY_BOOL; - case bob::io::base::array::t_int8: - return NPY_INT8; - case bob::io::base::array::t_int16: - return NPY_INT16; - case bob::io::base::array::t_int32: - return NPY_INT32; - case bob::io::base::array::t_int64: - return NPY_INT64; - case bob::io::base::array::t_uint8: - return NPY_UINT8; - case bob::io::base::array::t_uint16: - return NPY_UINT16; - case bob::io::base::array::t_uint32: - return NPY_UINT32; - case bob::io::base::array::t_uint64: - return NPY_UINT64; - case bob::io::base::array::t_float32: - return NPY_FLOAT32; - case bob::io::base::array::t_float64: - return NPY_FLOAT64; -#ifdef NPY_FLOAT128 - case bob::io::base::array::t_float128: - return NPY_FLOAT128; -#endif - case bob::io::base::array::t_complex64: - return NPY_COMPLEX64; - case bob::io::base::array::t_complex128: - return NPY_COMPLEX128; -#ifdef NPY_COMPLEX256 - case bob::io::base::array::t_complex256: - return NPY_COMPLEX256; -#endif - default: - PyErr_Format(PyExc_TypeError, "unsupported Bob/C++ element type (%s)", bob::io::base::array::stringize(type)); - } - - return NPY_NOTYPE; - -} - -static PyObject* PyBobIoFile_getIndex (PyBobIoFileObject* self, Py_ssize_t i) { - if (i < 0) i += self->f->size(); ///< adjust for negative indexing - - if (i < 0 || (size_t)i >= self->f->size()) { - PyErr_Format(PyExc_IndexError, "file index out of range - `%s' only contains %" PY_FORMAT_SIZE_T "d object(s)", self->f->filename(), self->f->size()); - return 0; - } - - const bob::io::base::array::typeinfo& info = self->f->type(); - - npy_intp shape[NPY_MAXDIMS]; - for (size_t k=0; k<info.nd; ++k) shape[k] = info.shape[k]; - - int type_num = PyBobIo_AsTypenum(info.dtype); - if (type_num == NPY_NOTYPE) return 0; ///< failure - - PyObject* retval = PyArray_SimpleNew(info.nd, shape, type_num); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - bobskin skin((PyArrayObject*)retval, info.dtype); - self->f->read(skin, i); - return Py_BuildValue("O", retval); -} - -static PyObject* PyBobIoFile_getSlice (PyBobIoFileObject* self, PySliceObject* slice) { - - Py_ssize_t start, stop, step, slicelength; -#if PY_VERSION_HEX < 0x03000000 - if (PySlice_GetIndicesEx(slice, -#else - if (PySlice_GetIndicesEx(reinterpret_cast<PyObject*>(slice), -#endif - self->f->size(), &start, &stop, &step, &slicelength) < 0) return 0; - - //creates the return array - const bob::io::base::array::typeinfo& info = self->f->type(); - - int type_num = PyBobIo_AsTypenum(info.dtype); - if (type_num == NPY_NOTYPE) return 0; ///< failure - - if (slicelength <= 0) return PyArray_SimpleNew(0, 0, type_num); - - npy_intp shape[NPY_MAXDIMS]; - shape[0] = slicelength; - for (size_t k=0; k<info.nd; ++k) shape[k+1] = info.shape[k]; - - PyObject* retval = PyArray_SimpleNew(info.nd+1, shape, type_num); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - Py_ssize_t counter = 0; - for (auto i = start; (start<=stop)?i<stop:i>stop; i+=step) { - - //get slice to fill - PyObject* islice = Py_BuildValue("n", counter++); - if (!islice) return 0; - auto islice_ = make_safe(islice); - - PyObject* item = PyObject_GetItem(retval, islice); - if (!item) return 0; - auto item_ = make_safe(item); - - bobskin skin((PyArrayObject*)item, info.dtype); - self->f->read(skin, i); - } - - return Py_BuildValue("O", retval); -} - -static PyObject* PyBobIoFile_getItem (PyBobIoFileObject* self, PyObject* item) { - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) return 0; - return PyBobIoFile_getIndex(self, i); - } - if (PySlice_Check(item)) { - return PyBobIoFile_getSlice(self, (PySliceObject*)item); - } - else { - PyErr_Format(PyExc_TypeError, "File indices must be integers, not %s", Py_TYPE(item)->tp_name); - return 0; - } -} - -static PyMappingMethods PyBobIoFile_Mapping = { - (lenfunc)PyBobIoFile_len, //mp_length - (binaryfunc)PyBobIoFile_getItem, //mp_subscript - 0 /* (objobjargproc)PyBobIoFile_SetItem //mp_ass_subscript */ -}; - - -static auto s_read = bob::extension::FunctionDoc( - "read", - "Reads a specific object in the file, or the whole file", - "This method reads data from the file. " - "If you specified an ``index``, it reads just the object indicated by the index, as you would do using the ``[]`` operator. " - "If the ``index`` is not specified, reads the whole contents of the file into a :py:class:`numpy.ndarray`.", - true -) -.add_prototype("[index]", "data") -.add_parameter("index", "int", "[optional] The index to the object one wishes to retrieve from the file; negative indexing is supported; if not given, implies retrieval of the whole file contents.") -.add_return("data", ":py:class:`numpy.ndarray`", "The contents of the file, as array") -; -static PyObject* PyBobIoFile_read(PyBobIoFileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_read.kwlist(); - - Py_ssize_t i = PY_SSIZE_T_MIN; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|n", kwlist, &i)) return 0; - - if (i != PY_SSIZE_T_MIN) { - - // reads a specific object inside the file - - if (i < 0) i += self->f->size(); - - if (i < 0 || (size_t)i >= self->f->size()) { - PyErr_Format(PyExc_IndexError, "file index out of range - `%s' only contains %" PY_FORMAT_SIZE_T "d object(s)", self->f->filename(), self->f->size()); - return 0; - } - - return PyBobIoFile_getIndex(self, i); - - } - - // reads the whole file in a single shot - - const bob::io::base::array::typeinfo& info = self->f->type_all(); - - npy_intp shape[NPY_MAXDIMS]; - for (size_t k=0; k<info.nd; ++k) shape[k] = info.shape[k]; - - int type_num = PyBobIo_AsTypenum(info.dtype); - if (type_num == NPY_NOTYPE) return 0; ///< failure - - PyObject* retval = PyArray_SimpleNew(info.nd, shape, type_num); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - bobskin skin((PyArrayObject*)retval, info.dtype); - self->f->read_all(skin); - - return Py_BuildValue("O", retval); -BOB_CATCH_MEMBER(exception_message(self, s_read.name()).c_str(), 0) -} - - -static auto s_write = bob::extension::FunctionDoc( - "write", - "Writes the contents of an object to the file", - "This method writes data to the file. " - "It acts like the given array is the only piece of data that will ever be written to such a file. " - "No more data appending may happen after a call to this method.", - true -) -.add_prototype("data") -.add_parameter("data", "array_like", "The array to be written into the file; it can be a :py:class:`numpy.ndarray`, a :py:class:`bob.blitz.array` or any other object which can be converted to either of them") -; -static PyObject* PyBobIoFile_write(PyBobIoFileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_write.kwlist(); - - PyBlitzArrayObject* bz = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist, &PyBlitzArray_Converter, &bz)) return 0; - - auto bz_ = make_safe(bz); - - bobskin skin(bz); - self->f->write(skin); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_write.name()).c_str(), 0) -} - - -static auto s_append = bob::extension::FunctionDoc( - "append", - "Adds the contents of an object to the file", - "This method appends data to the file. " - "If the file does not exist, creates a new file, else, makes sure that the inserted array respects the previously set file structure.", - true -) -.add_prototype("data", "position") -.add_parameter("data", "array_like", "The array to be written into the file; it can be a :py:class:`numpy.ndarray`, a :py:class:`bob.blitz.array` or any other object which can be converted to either of them") -.add_return("position", "int", "The current position of the newly written data") -; -static PyObject* PyBobIoFile_append(PyBobIoFileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_append.kwlist(); - - PyBlitzArrayObject* bz = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist, &PyBlitzArray_Converter, &bz)) return 0; - auto bz_ = make_safe(bz); - Py_ssize_t pos = -1; - - bobskin skin(bz); - pos = self->f->append(skin); - - return Py_BuildValue("n", pos); -BOB_CATCH_MEMBER(exception_message(self, s_append.name()).c_str(), 0) -} - - -PyObject* PyBobIo_TypeInfoAsTuple (const bob::io::base::array::typeinfo& ti) { - - int type_num = PyBobIo_AsTypenum(ti.dtype); - if (type_num == NPY_NOTYPE) return 0; - - PyObject* retval = Py_BuildValue("NNN", - reinterpret_cast<PyObject*>(PyArray_DescrFromType(type_num)), - PyTuple_New(ti.nd), //shape - PyTuple_New(ti.nd) //strides - ); - if (!retval) return 0; - - PyObject* shape = PyTuple_GET_ITEM(retval, 1); - PyObject* stride = PyTuple_GET_ITEM(retval, 2); - for (Py_ssize_t i=0; (size_t)i<ti.nd; ++i) { - PyTuple_SET_ITEM(shape, i, Py_BuildValue("n", ti.shape[i])); - PyTuple_SET_ITEM(stride, i, Py_BuildValue("n", ti.stride[i])); - } - - return retval; -} - -static auto s_describe = bob::extension::FunctionDoc( - "describe", - "Returns a description (dtype, shape, stride) of data at the file", - 0, - true -) -.add_prototype("[all]", "dtype, shape, stride") -.add_parameter("all", "bool", "[Default: ``False``] If set to ``True``, returns the shape and strides for reading the whole file contents in one shot.") -.add_return("dtype", ":py:class:`numpy.dtype`", "The data type of the object") -.add_return("shape", "tuple", "The shape of the object") -.add_return("stride", "tuple", "The stride of the object") -; -static PyObject* PyBobIoFile_describe(PyBobIoFileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static const char* const_kwlist[] = {"all", 0}; - static char** kwlist = const_cast<char**>(const_kwlist); - - PyObject* all = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &all)) return 0; - - const bob::io::base::array::typeinfo* info = 0; - if (all && PyObject_IsTrue(all)) info = &self->f->type_all(); - else info = &self->f->type(); - - /* Now return type description and tuples with shape and strides */ - return PyBobIo_TypeInfoAsTuple(*info); -BOB_CATCH_MEMBER(exception_message(self, s_describe.name()).c_str(), 0) -} - - -static PyMethodDef PyBobIoFile_methods[] = { - { - s_read.name(), - (PyCFunction)PyBobIoFile_read, - METH_VARARGS|METH_KEYWORDS, - s_read.doc(), - }, - { - s_write.name(), - (PyCFunction)PyBobIoFile_write, - METH_VARARGS|METH_KEYWORDS, - s_write.doc(), - }, - { - s_append.name(), - (PyCFunction)PyBobIoFile_append, - METH_VARARGS|METH_KEYWORDS, - s_append.doc(), - }, - { - s_describe.name(), - (PyCFunction)PyBobIoFile_describe, - METH_VARARGS|METH_KEYWORDS, - s_describe.doc(), - }, - {0} /* Sentinel */ -}; - -/********************************** - * Definition of Iterator to File * - **********************************/ - -PyDoc_STRVAR(s_fileiterator_str, BOB_EXT_MODULE_PREFIX ".File.iter"); - -/* How to create a new PyBobIoFileIteratorObject */ -static PyObject* PyBobIoFileIterator_New(PyTypeObject* type, PyObject*, PyObject*) { - - /* Allocates the python object itself */ - PyBobIoFileIteratorObject* self = (PyBobIoFileIteratorObject*)type->tp_alloc(type, 0); - - return reinterpret_cast<PyObject*>(self); -} - -static PyObject* PyBobIoFileIterator_iter (PyBobIoFileIteratorObject* self) { - return reinterpret_cast<PyObject*>(self); -} - -static PyObject* PyBobIoFileIterator_next (PyBobIoFileIteratorObject* self) { - if ((size_t)self->curpos >= self->pyfile->f->size()) { - Py_XDECREF((PyObject*)self->pyfile); - self->pyfile = 0; - return 0; - } - return PyBobIoFile_getIndex(self->pyfile, self->curpos++); -} - -static PyObject* PyBobIoFile_iter (PyBobIoFileObject* self) { - PyBobIoFileIteratorObject* retval = (PyBobIoFileIteratorObject*)PyBobIoFileIterator_New(&PyBobIoFileIterator_Type, 0, 0); - if (!retval) return 0; - retval->pyfile = self; - retval->curpos = 0; - return Py_BuildValue("N", retval); -} - -#if PY_VERSION_HEX >= 0x03000000 -# define Py_TPFLAGS_HAVE_ITER 0 -#endif - -PyTypeObject PyBobIoFileIterator_Type = { - PyVarObject_HEAD_INIT(0, 0) - 0 -}; - - -PyTypeObject PyBobIoFile_Type = { - PyVarObject_HEAD_INIT(0, 0) - 0 -}; - -bool init_File(PyObject* module){ - - // initialize the iterator - PyBobIoFileIterator_Type.tp_name = s_fileiterator_str; - PyBobIoFileIterator_Type.tp_basicsize = sizeof(PyBobIoFileIteratorObject); - PyBobIoFileIterator_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER; - PyBobIoFileIterator_Type.tp_iter = (getiterfunc)PyBobIoFileIterator_iter; - PyBobIoFileIterator_Type.tp_iternext = (iternextfunc)PyBobIoFileIterator_next; - - // initialize the File - PyBobIoFile_Type.tp_name = s_file.name(); - PyBobIoFile_Type.tp_basicsize = sizeof(PyBobIoFileObject); - PyBobIoFile_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; - PyBobIoFile_Type.tp_doc = s_file.doc(); - - // set the functions - PyBobIoFile_Type.tp_new = PyBobIoFile_New; - PyBobIoFile_Type.tp_init = reinterpret_cast<initproc>(PyBobIoFile_init); - PyBobIoFile_Type.tp_dealloc = reinterpret_cast<destructor>(PyBobIoFile_Delete); - PyBobIoFile_Type.tp_methods = PyBobIoFile_methods; - PyBobIoFile_Type.tp_getset = PyBobIoFile_getseters; - PyBobIoFile_Type.tp_iter = (getiterfunc)PyBobIoFile_iter; - - PyBobIoFile_Type.tp_str = reinterpret_cast<reprfunc>(PyBobIoFile_repr); - PyBobIoFile_Type.tp_repr = reinterpret_cast<reprfunc>(PyBobIoFile_repr); - PyBobIoFile_Type.tp_as_mapping = &PyBobIoFile_Mapping; - - - // check that everything is fine - if (PyType_Ready(&PyBobIoFile_Type) < 0) - return false; - if (PyType_Ready(&PyBobIoFileIterator_Type) < 0) - return false; - - // add the type to the module - Py_INCREF(&PyBobIoFile_Type); - bool success = PyModule_AddObject(module, s_file.name(), (PyObject*)&PyBobIoFile_Type) >= 0; - if (!success) return false; - Py_INCREF(&PyBobIoFileIterator_Type); - success = PyModule_AddObject(module, s_fileiterator_str, (PyObject*)&PyBobIoFileIterator_Type) >= 0; - return success; -} diff --git a/bob/io/base/hdf5.cpp b/bob/io/base/hdf5.cpp deleted file mode 100644 index 42347bd..0000000 --- a/bob/io/base/hdf5.cpp +++ /dev/null @@ -1,2137 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Tue 12 Nov 18:19:22 2013 - * - * @brief Bindings to bob::io::base::HDF5File - */ - -#define BOB_IO_BASE_MODULE -#include <bob.io.base/api.h> - -#include <boost/make_shared.hpp> -#include <numpy/arrayobject.h> -#include <bob.blitz/cppapi.h> -#include <bob.blitz/cleanup.h> -#include <bob.extension/documentation.h> -#include <stdexcept> -#include <cstring> - -/* Creates an exception message including the name of the given file, if possible */ -inline const std::string exception_message(PyBobIoHDF5FileObject* self, const std::string& name){ - std::ostringstream str; - str << name << " ("; - try{ - str << "'" << self->f->filename() << "'"; - } catch (...){ - str << "<unkown>"; - } - str << ")"; - return str.str(); -} - -static auto s_hdf5file = bob::extension::ClassDoc( - "HDF5File", - "Reads and writes data to HDF5 files.", - "HDF5 stands for Hierarchical Data Format version 5. " - "It is a flexible, binary file format that allows one to store and read data efficiently into or from files. " - "It is a cross-platform, cross-architecture format.\n\n" - "Objects of this class allows users to read and write data from and to files in HDF5 format. " - "For an introduction to HDF5, visit the `HDF5 Website <http://www.hdfgroup.org/HDF5>`_." -) -.add_constructor( - bob::extension::FunctionDoc( - "HDF5File", - "Opens an HFF5 file for reading, writing or appending.", - "For the ``open`` mode, use ``'r'`` for read-only ``'a'`` for read/write/append, ``'w'`` for read/write/truncate or ``'x'`` for (read/write/exclusive). " - "When another :py:class:`HDF5File` object is given, a shallow copy is created, pointing to the same file." - ) - .add_prototype("filename, [mode]","") - .add_prototype("hdf5", "") - .add_parameter("filename", "str", "The file path to the file you want to open for reading or writing") - .add_parameter("mode", "one of ('r', 'w', 'a', 'x')", "[Default: ``'r'``] The opening mode") - .add_parameter("hdf5", ":py:class:`HDF5File`", "An HDF5 file to copy-construct") -); - - -int PyBobIoHDF5File_Check(PyObject* o) { - if (!o) return 0; - return PyObject_IsInstance(o, reinterpret_cast<PyObject*>(&PyBobIoHDF5File_Type)); -} - -int PyBobIoHDF5File_Converter(PyObject* o, PyBobIoHDF5FileObject** a) { - if (!PyBobIoHDF5File_Check(o)) return 0; - Py_INCREF(o); - (*a) = reinterpret_cast<PyBobIoHDF5FileObject*>(o); - return 1; -} - -/* How to create a new PyBobIoHDF5FileObject */ -static PyObject* PyBobIoHDF5File_New(PyTypeObject* type, PyObject*, PyObject*) { - - /* Allocates the python object itself */ - PyBobIoHDF5FileObject* self = (PyBobIoHDF5FileObject*)type->tp_alloc(type, 0); - - self->f.reset(); - - return reinterpret_cast<PyObject*>(self); -} - -static void PyBobIoHDF5File_Delete (PyBobIoHDF5FileObject* o) { - - o->f.reset(); - Py_TYPE(o)->tp_free((PyObject*)o); -} - -static bob::io::base::HDF5File::mode_t mode_from_char (char mode) { - - bob::io::base::HDF5File::mode_t new_mode = bob::io::base::HDF5File::inout; - - switch (mode) { - case 'r': new_mode = bob::io::base::HDF5File::in; break; - case 'a': new_mode = bob::io::base::HDF5File::inout; break; - case 'w': new_mode = bob::io::base::HDF5File::trunc; break; - case 'x': new_mode = bob::io::base::HDF5File::excl; break; - default: - PyErr_SetString(PyExc_RuntimeError, "Supported flags are 'r' (read-only), 'a' (read/write/append), 'w' (read/write/truncate) or 'x' (read/write/exclusive)"); - } - - return new_mode; - -} - -/* The __init__(self) method */ -static int PyBobIoHDF5File_init(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist1 = s_hdf5file.kwlist(0); - static char** kwlist2 = s_hdf5file.kwlist(1); - - // get the number of command line arguments - Py_ssize_t nargs = (args?PyTuple_Size(args):0) + (kwds?PyDict_Size(kwds):0); - - if (!nargs){ - // at least one argument is required - PyErr_Format(PyExc_TypeError, "`%s' constructor requires at least one parameter", Py_TYPE(self)->tp_name); - return -1; - } // nargs == 0 - - PyObject* k = Py_BuildValue("s", kwlist2[0]); - auto k_ = make_safe(k); - if ( - (kwds && PyDict_Contains(kwds, k)) || - (args && PyBobIoHDF5File_Check(PyTuple_GET_ITEM(args, 0))) - ){ - PyBobIoHDF5FileObject* other; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist2, &PyBobIoHDF5File_Converter, &other)) - return -1; - auto other_ = make_safe(other); - self->f = other->f; - return 0; - } - -#if PY_VERSION_HEX >= 0x03000000 -# define MODE_CHAR "C" - int mode = 'r'; -#else -# define MODE_CHAR "c" - char mode = 'r'; -#endif - - const char* filename; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|" MODE_CHAR, kwlist1, - &PyBobIo_FilenameConverter, &filename, &mode)) - return -1; - -#undef MODE_CHAR - - if (mode != 'r' && mode != 'w' && mode != 'a' && mode != 'x') { - PyErr_Format(PyExc_ValueError, "file open mode string should have 1 element and be either 'r' (read), 'w' (write), 'a' (append), 'x' (exclusive)"); - return -1; - } - bob::io::base::HDF5File::mode_t mode_mode = mode_from_char(mode); - if (PyErr_Occurred()) return -1; - - self->f.reset(new bob::io::base::HDF5File(filename, mode_mode)); - return 0; ///< SUCCESS -BOB_CATCH_MEMBER("hdf5 constructor", -1) -} - - -static PyObject* PyBobIoHDF5File_repr(PyBobIoHDF5FileObject* self) { -BOB_TRY - return PyString_FromFormat("%s(filename='%s')", Py_TYPE(self)->tp_name, self->f->filename().c_str()); -BOB_CATCH_MEMBER("__repr__", 0) -} - - -static auto s_flush = bob::extension::FunctionDoc( - "flush", - "Flushes the content of the HDF5 file to disk", - "When the HDF5File is open for writing, this function synchronizes the contents on the disk with the one from the file. " - "When the file is open for reading, nothing happens.", - true -) - .add_prototype("") -; -static PyObject* PyBobIoHDF5File_flush(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_flush.kwlist(); - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) return 0; - - self->f->flush(); - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_flush.name()).c_str(), 0) -} - - -static auto s_close = bob::extension::FunctionDoc( - "close", - "Closes this file", - "This function closes the HDF5File after flushing all its contents to disk. " - "After the HDF5File is closed, any operation on it will result in an exception.", - true -) -.add_prototype("") -; -static PyObject* PyBobIoHDF5File_close(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_close.kwlist(); - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) return 0; - - self->f->close(); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_close.name()).c_str(), 0); -} - - -static auto s_cd = bob::extension::FunctionDoc( - "cd", - "Changes the current prefix path", - "When this object is created the prefix path is empty, which means all following paths to data objects should be given using the full path. " - "If you set the ``path`` to a different value, it will be used as a prefix to any subsequent operation until you reset it. " - "If ``path`` starts with ``'/'``, it is treated as an absolute path. " - "If the value is relative, it is added to the current path; ``'..'`` and ``'.'`` are supported. " - "If it is absolute, it causes the prefix to be reset.\n\n" - "..note:: All operations taking a relative path, following a :py:func:`cd`, will be considered relative to the value defined by the :py:attr:`cwd` property of this object.", - true -) -.add_prototype("path") -.add_parameter("path", "str", "The path to change directories to") -; - -static PyObject* PyBobIoHDF5File_changeDirectory(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_cd.kwlist(); - - const char* path = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &path)) return 0; - - self->f->cd(path); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_cd.name()).c_str(), 0) -} - - -static auto s_has_group = bob::extension::FunctionDoc( - "has_group", - "Checks if a path (group) exists inside a file", - "This method does not work for datasets, only for directories. " - "If the given path is relative, it is take w.r.t. to the current working directory.", - true -) -.add_prototype("path") -.add_parameter("path", "str", "The path to check") -; -static PyObject* PyBobIoHDF5File_hasGroup(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_has_group.kwlist(); - - const char* path = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &path)) return 0; - - if (self->f->hasGroup(path)) Py_RETURN_TRUE; - Py_RETURN_FALSE; -BOB_CATCH_MEMBER(exception_message(self, s_has_group.name()).c_str(), 0) -} - - -static auto s_create_group = bob::extension::FunctionDoc( - "create_group", - "Creates a new path (group) inside the file", - "A relative path is taken w.r.t. to the current directory. " - "If the directory already exists (check it with :py:meth:`has_group`), an exception will be raised.", - true -) -.add_prototype("path") -.add_parameter("path", "str", "The path to create.") -; -static PyObject* PyBobIoHDF5File_createGroup(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_create_group.kwlist(); - - const char* path = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &path)) return 0; - - self->f->createGroup(path); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_create_group.name()).c_str(), 0) -} - - -static auto s_has_dataset = bob::extension::FunctionDoc( - "has_dataset", - "Checks if a dataset exists inside a file", - "Checks if a dataset exists inside a file, on the specified path. " - "If the given path is relative, it is take w.r.t. to the current working directory.\n\n" - ".. note:: The functions :py:meth:`has_dataset` and :py:meth:`has_key` are synonyms. " - "You can also use the Python's ``in`` operator instead of :py:meth:`has_key`: ``key in hdf5file``.", - true -) -.add_prototype("key") -.add_parameter("key", "str", "The dataset path to check") -; -auto s_has_key = s_has_dataset.clone("has_key"); -static PyObject* PyBobIoHDF5File_hasDataset(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_has_dataset.kwlist(); - - const char* key = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &key)) return 0; - - if (self->f->contains(key)) Py_RETURN_TRUE; - - Py_RETURN_FALSE; -BOB_CATCH_MEMBER(exception_message(self, s_has_dataset.name()).c_str(), 0) -} - -static bob::io::base::hdf5type PyBobIo_H5FromTypenum (int type_num) { - - switch(type_num) { - case NPY_STRING: return bob::io::base::s; - case NPY_BOOL: return bob::io::base::b; - case NPY_INT8: return bob::io::base::i8; - case NPY_INT16: return bob::io::base::i16; - case NPY_INT32: return bob::io::base::i32; - case NPY_INT64: return bob::io::base::i64; - case NPY_UINT8: return bob::io::base::u8; - case NPY_UINT16: return bob::io::base::u16; - case NPY_UINT32: return bob::io::base::u32; - case NPY_UINT64: return bob::io::base::u64; - case NPY_FLOAT32: return bob::io::base::f32; - case NPY_FLOAT64: return bob::io::base::f64; -#ifdef NPY_FLOAT128 - case NPY_FLOAT128: return bob::io::base::f128; -#endif - case NPY_COMPLEX64: return bob::io::base::c64; - case NPY_COMPLEX128: return bob::io::base::c128; -#ifdef NPY_COMPLEX256 - case NPY_COMPLEX256: return bob::io::base::c256; -#endif -#if defined(__LP64__) || defined(__APPLE__) - case NPY_LONGLONG: - switch (NPY_BITSOF_LONGLONG) { - case 8: return bob::io::base::i8; - case 16: return bob::io::base::i16; - case 32: return bob::io::base::i32; - case 64: return bob::io::base::i64; - default: return bob::io::base::unsupported; - } - break; - case NPY_ULONGLONG: - switch (NPY_BITSOF_LONGLONG) { - case 8: return bob::io::base::u8; - case 16: return bob::io::base::u16; - case 32: return bob::io::base::u32; - case 64: return bob::io::base::u64; - default: return bob::io::base::unsupported; - } - break; -#endif - default: return bob::io::base::unsupported; - } - -} - -static int PyBobIo_H5AsTypenum (bob::io::base::hdf5type type) { - - switch(type) { - case bob::io::base::s: return NPY_STRING; - case bob::io::base::b: return NPY_BOOL; - case bob::io::base::i8: return NPY_INT8; - case bob::io::base::i16: return NPY_INT16; - case bob::io::base::i32: return NPY_INT32; - case bob::io::base::i64: return NPY_INT64; - case bob::io::base::u8: return NPY_UINT8; - case bob::io::base::u16: return NPY_UINT16; - case bob::io::base::u32: return NPY_UINT32; - case bob::io::base::u64: return NPY_UINT64; - case bob::io::base::f32: return NPY_FLOAT32; - case bob::io::base::f64: return NPY_FLOAT64; -#ifdef NPY_FLOAT128 - case bob::io::base::f128: return NPY_FLOAT128; -#endif - case bob::io::base::c64: return NPY_COMPLEX64; - case bob::io::base::c128: return NPY_COMPLEX128; -#ifdef NPY_COMPLEX256 - case bob::io::base::c256: return NPY_COMPLEX256; -#endif - default: return NPY_NOTYPE; - } - -} - -static PyObject* PyBobIo_HDF5TypeAsTuple (const bob::io::base::HDF5Type& t) { - - const bob::io::base::HDF5Shape& sh = t.shape(); - size_t ndim = sh.n(); - const hsize_t* shptr = sh.get(); - - int type_num = PyBobIo_H5AsTypenum(t.type()); - if (type_num == NPY_NOTYPE) { - PyErr_Format(PyExc_TypeError, "unsupported HDF5 element type (%d) found during conversion to numpy type number", (int)t.type()); - return 0; - } - - PyObject* dtype = reinterpret_cast<PyObject*>(PyArray_DescrFromType(type_num)); - if (!dtype) return 0; - auto dtype_ = make_safe(dtype); - - PyObject* shape = PyTuple_New(ndim); - if (!shape) return 0; - auto shape_ = make_safe(shape); - - PyObject* retval = Py_BuildValue("OO", dtype, shape); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - for (Py_ssize_t i=0; i<(Py_ssize_t)ndim; ++i) { - PyObject* value = Py_BuildValue("n", shptr[i]); - if (!value) return 0; - PyTuple_SET_ITEM(shape, i, value); - } - - return Py_BuildValue("O", retval); - -} - -static PyObject* PyBobIo_HDF5DescriptorAsTuple (const bob::io::base::HDF5Descriptor& d) { - return Py_BuildValue("NnO", - PyBobIo_HDF5TypeAsTuple(d.type), - d.size, - d.expandable? Py_True : Py_False - ); //steals references, except for True/False -} - - -static auto s_describe = bob::extension::FunctionDoc( - "describe", - "Describes a dataset type/shape, if it exists inside a file", - "If a given ``key`` to an HDF5 dataset exists inside the file, returns a type description of objects recorded in such a dataset, otherwise, raises an exception. " - "The returned value type is a list of tuples (HDF5Type, number-of-objects, expandable) describing the capabilities if the file is read using these formats. \n\n", - true -) -.add_prototype("key", "[(hdf5type, size, expandable)]") -.add_parameter("key", "str", "The dataset path to describe") -.add_return("hdf5type", "tuple", "The HDF5Type of the returned array") -.add_return("size", "int", "The number of objects in the dataset") -.add_return("expandable", "bool", "Defines if this object can be resized.") -; -static PyObject* PyBobIoHDF5File_describe(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_describe.kwlist(); - - const char* key = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &key)) return 0; - - const std::vector<bob::io::base::HDF5Descriptor>& dv = self->f->describe(key); - PyObject* retval = PyList_New(dv.size()); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - for (size_t k=0; k<dv.size(); ++k) { - PyObject* entry = PyBobIo_HDF5DescriptorAsTuple(dv[k]); - if (!entry) return 0; - PyList_SET_ITEM(retval, k, entry); - } - - return Py_BuildValue("O", retval); -BOB_CATCH_MEMBER(exception_message(self, s_describe.name()).c_str(), 0) -} - - -static auto s_unlink = bob::extension::FunctionDoc( - "unlink", - "Unlinks datasets inside the file making them invisible", - "If a given path to an HDF5 dataset exists inside the file, unlinks it." - "Please note this will note remove the data from the file, just make it inaccessible. " - "If you wish to cleanup, save the reacheable objects from this file to another :py:class:`HDF5File` object using :py:meth:`copy`, for example.", - true -) -.add_prototype("key") -.add_parameter("key", "str", "The dataset path to unlink") -; -static PyObject* PyBobIoHDF5File_unlink(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_unlink.kwlist(); - - const char* key = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &key)) return 0; - - self->f->unlink(key); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_unlink.name()).c_str(), 0) -} - - -static auto s_rename = bob::extension::FunctionDoc( - "rename", - "Renames datasets in a file", - 0, - true -) -.add_prototype("from, to") -.add_parameter("from", "str", "The path to the data to be renamed") -.add_parameter("to", "str", "The new name of the dataset") -; -static PyObject* PyBobIoHDF5File_rename(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_rename.kwlist(); - - const char* from = 0; - const char* to = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss", kwlist, &from, &to)) return 0; - - self->f->rename(from, to); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_rename.name()).c_str(), 0) -} - - -static auto s_paths = bob::extension::FunctionDoc( - "paths", - "Lists datasets available inside this file", - "Returns all paths to datasets available inside this file, stored under the current working directory. " - "If ``relative`` is set to ``True``, the returned paths are relative to the current working directory, otherwise they are absolute.\n\n" - ".. note:: The functions :py:meth:`keys` and :py:meth:`paths` are synonyms.", - true -) -.add_prototype("[relative]", "paths") -.add_parameter("relative", "bool", "[Default: ``False``] If set to ``True``, the returned paths are relative to the current working directory, otherwise they are absolute") -.add_return("paths", "[str]", "A list of paths inside this file") -; -auto s_keys = s_paths.clone("keys"); -static PyObject* PyBobIoHDF5File_paths(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_paths.kwlist(); - - PyObject* pyrel = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &pyrel)) return 0; - - bool relative = false; - if (pyrel && PyObject_IsTrue(pyrel)) relative = true; - - std::vector<std::string> values; - self->f->paths(values, relative); - PyObject* retval = PyList_New(values.size()); - if (!retval) return 0; - auto retval_ = make_safe(retval); - for (size_t i=0; i<values.size(); ++i) { - PyList_SET_ITEM(retval, i, Py_BuildValue("s", values[i].c_str())); - } - - return Py_BuildValue("O", retval); -BOB_CATCH_MEMBER(exception_message(self, s_paths.name()).c_str(), 0) -} - - -static auto s_sub_groups = bob::extension::FunctionDoc( - "sub_groups", - "Lists groups (directories) in the current file", - 0, - true -) -.add_prototype("[relative], [recursive]", "groups") -.add_parameter("relative", "bool", "[Default: ``False``] If set to ``True``, the returned sub-groups are relative to the current working directory, otherwise they are absolute") -.add_parameter("recursive", "bool", "[Default: ``True``] If set to ``False``, the returned sub-groups are only the ones in the current directory, otherwise recurses down the directory structure") -.add_return("groups", "[str]", "The list of directories (groups) inside this file") -; -static PyObject* PyBobIoHDF5File_subGroups(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_sub_groups.kwlist(); - - PyObject* pyrel = 0; - PyObject* pyrec = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO", kwlist, &pyrel, &pyrec)) return 0; - - bool relative = (pyrel && PyObject_IsTrue(pyrel)); - bool recursive = (!pyrec || PyObject_IsTrue(pyrec)); - - std::vector<std::string> values; - self->f->sub_groups(values, relative, recursive); - PyObject* retval = PyList_New(values.size()); - if (!retval) return 0; - auto retval_ = make_safe(retval); - for (size_t i=0; i<values.size(); ++i) { - PyList_SET_ITEM(retval, i, Py_BuildValue("s", values[i].c_str())); - } - - return Py_BuildValue("O", retval); -BOB_CATCH_MEMBER(exception_message(self, s_sub_groups.name()).c_str(), 0) -} - - -static PyObject* PyBobIoHDF5File_Xread(PyBobIoHDF5FileObject* self, const char* p, int descriptor, int pos) { - - const std::vector<bob::io::base::HDF5Descriptor> D = self->f->describe(p); - - //last descriptor always contains the full readout. - const bob::io::base::HDF5Type& type = D[descriptor].type; - const bob::io::base::HDF5Shape& shape = type.shape(); - - if (shape.n() == 1 && shape[0] == 1) { //read as scalar - switch(type.type()) { - case bob::io::base::s: - return Py_BuildValue("s", self->f->read<std::string>(p, pos).c_str()); - case bob::io::base::b: - return PyBlitzArrayCxx_FromCScalar(self->f->read<bool>(p, pos)); - case bob::io::base::i8: - return PyBlitzArrayCxx_FromCScalar(self->f->read<int8_t>(p, pos)); - case bob::io::base::i16: - return PyBlitzArrayCxx_FromCScalar(self->f->read<int16_t>(p, pos)); - case bob::io::base::i32: - return PyBlitzArrayCxx_FromCScalar(self->f->read<int32_t>(p, pos)); - case bob::io::base::i64: - return PyBlitzArrayCxx_FromCScalar(self->f->read<int64_t>(p, pos)); - case bob::io::base::u8: - return PyBlitzArrayCxx_FromCScalar(self->f->read<uint8_t>(p, pos)); - case bob::io::base::u16: - return PyBlitzArrayCxx_FromCScalar(self->f->read<uint16_t>(p, pos)); - case bob::io::base::u32: - return PyBlitzArrayCxx_FromCScalar(self->f->read<uint32_t>(p, pos)); - case bob::io::base::u64: - return PyBlitzArrayCxx_FromCScalar(self->f->read<uint64_t>(p, pos)); - case bob::io::base::f32: - return PyBlitzArrayCxx_FromCScalar(self->f->read<float>(p, pos)); - case bob::io::base::f64: - return PyBlitzArrayCxx_FromCScalar(self->f->read<double>(p, pos)); - case bob::io::base::f128: - return PyBlitzArrayCxx_FromCScalar(self->f->read<long double>(p, pos)); - case bob::io::base::c64: - return PyBlitzArrayCxx_FromCScalar(self->f->read<std::complex<float> >(p, pos)); - case bob::io::base::c128: - return PyBlitzArrayCxx_FromCScalar(self->f->read<std::complex<double> >(p, pos)); - case bob::io::base::c256: - return PyBlitzArrayCxx_FromCScalar(self->f->read<std::complex<long double> >(p, pos)); - default: - PyErr_Format(PyExc_TypeError, "unsupported HDF5 type: %s", type.str().c_str()); - return 0; - } - } - - //read as an numpy array - int type_num = PyBobIo_H5AsTypenum(type.type()); - if (type_num == NPY_NOTYPE) return 0; ///< failure - - npy_intp pyshape[NPY_MAXDIMS]; - for (size_t k=0; k<shape.n(); ++k) pyshape[k] = shape.get()[k]; - - PyObject* retval = PyArray_SimpleNew(shape.n(), pyshape, type_num); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - self->f->read_buffer(p, pos, type, PyArray_DATA((PyArrayObject*)retval)); - - return Py_BuildValue("O", retval); -} - - -static auto s_read = bob::extension::FunctionDoc( - "read", - "Reads whole datasets from the file", - "This function reads full data sets from this file. " - "The data type is dependent on the stored data, but is generally a :py:class:`numpy.ndarray`.\n\n" - ".. note:: The functions :py:func:`read` and :py:func:`get` are synonyms." -) -.add_prototype("key", "data") -.add_parameter("key", "str", "The path to the dataset to read data from; can be an absolute value (starting with a leading ``'/'``) or relative to the current working directory :py:attr:`cwd`") -.add_return("data", ":py:class:`numpy.ndarray` or other", "The data read from this file at the given key") -; -auto s_get = s_read.clone("get"); -static PyObject* PyBobIoHDF5File_read(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - - /* Parses input arguments in a single shot */ - static char** kwlist = s_read.kwlist(); - - const char* key = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &key)) return 0; - - return PyBobIoHDF5File_Xread(self, key, 1, 0); -BOB_CATCH_MEMBER(exception_message(self, s_read.name()).c_str(), 0) -} - - -static auto s_lread = bob::extension::FunctionDoc( - "lread", - "Reads some contents of the dataset", - "This method reads contents from a dataset, treating the N-dimensional dataset like a container for multiple objects with N-1 dimensions. " - "It returns a single :py:class:`numpy.ndarray` in case ``pos`` is set to a value >= 0, or a list of arrays otherwise." -) -.add_prototype("key, [pos]", "data") -.add_parameter("key", "str", "The path to the dataset to read data from, can be an absolute value (starting with a leading ``'/'``) or relative to the current working directory :py:attr:`cwd`") -.add_parameter("pos", "int", "If given and >= 0 returns the data object with the given index, otherwise returns a list by reading all objects in sequence") -.add_return("data", ":py:class:`numpy.ndarray` or [:py:class:`numpy.ndarray`]", "The data read from this file") -; -static PyObject* PyBobIoHDF5File_listRead(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_lread.kwlist(); - - const char* key = 0; - Py_ssize_t pos = -1; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|n", kwlist, &key, &pos)) return 0; - - if (pos >= 0) return PyBobIoHDF5File_Xread(self, key, 0, pos); - - //otherwise returns as a list - const std::vector<bob::io::base::HDF5Descriptor>& D = self->f->describe(key); - - PyObject* retval = PyList_New(D[0].size); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - for (uint64_t k=0; k<D[0].size; ++k) { - PyObject* item = PyBobIoHDF5File_Xread(self, key, 0, k); - if (!item) return 0; - PyList_SET_ITEM(retval, k, item); - } - - return Py_BuildValue("O", retval); -BOB_CATCH_MEMBER(exception_message(self, s_lread.name()).c_str(), 0) -} - - -/** - * Sets at 't', the type of the object 'o' according to our support types. - * Raise in case of problems. Furthermore, returns 'true' if the object is as - * simple scalar. - */ - -static void null_char_array_deleter(char*) {} - -#if PY_VERSION_HEX >= 0x03000000 -static void char_array_deleter(char* o) { delete[] o; } -#endif - -static boost::shared_ptr<char> PyBobIo_GetString(PyObject* o) { - -#if PY_VERSION_HEX < 0x03000000 - - return boost::shared_ptr<char>(PyString_AsString(o), null_char_array_deleter); - -#else - - if (PyBytes_Check(o)) { - //fast way out - return boost::shared_ptr<char>(PyBytes_AsString(o), null_char_array_deleter); - } - - PyObject* bytes = 0; - - if (PyUnicode_Check(o)) { - //re-encode using utf-8 - bytes = PyUnicode_AsEncodedString(o, "utf-8", "strict"); - } - else { - //tries coercion - bytes = PyObject_Bytes(o); - } - auto bytes_ = make_safe(bytes); ///< protects acquired resource - - Py_ssize_t length = PyBytes_GET_SIZE(bytes)+1; - char* copy = new char[length]; - std::strncpy(copy, PyBytes_AsString(bytes), length); - - return boost::shared_ptr<char>(copy, char_array_deleter); - -#endif - -} - -static int PyBobIoHDF5File_setStringType(bob::io::base::HDF5Type& t, PyObject* o) { - auto value = PyBobIo_GetString(o); - if (!value) return -1; - t = bob::io::base::HDF5Type(value.get()); - return 0; -} - -template <typename T> int PyBobIoHDF5File_setType(bob::io::base::HDF5Type& t) { - T v; - t = bob::io::base::HDF5Type(v); - return 0; -} - -/** - * A function to check for python scalars that works with numpy-1.6.x - */ -static bool PyBobIoHDF5File_isPythonScalar(PyObject* obj) { - return ( - PyBool_Check(obj) || -#if PY_VERSION_HEX < 0x03000000 - PyString_Check(obj) || -#else - PyBytes_Check(obj) || -#endif - PyUnicode_Check(obj) || -#if PY_VERSION_HEX < 0x03000000 - PyInt_Check(obj) || -#endif - PyLong_Check(obj) || - PyFloat_Check(obj) || - PyComplex_Check(obj) - ); -} - -/** - * Returns the type of object `op' is - a scalar (return value = 0), a - * bob.blitz.array (return value = 1), a numpy.ndarray (return value = 2), an - * object which is convertible to a numpy.ndarray (return value = 3) or returns - * -1 if the object cannot be converted. No error is set on the python stack. - * - * If the object is convertible into a numpy.ndarray, then it is converted into - * a numpy ndarray and the resulting object is placed in `converted'. If - * `*converted' is set to 0 (NULL), then we don't try a conversion, returning - * -1. - */ -static int PyBobIoHDF5File_getObjectType(PyObject* o, bob::io::base::HDF5Type& t, - PyObject** converted=0) { - - if (PyArray_IsScalar(o, Generic) || PyBobIoHDF5File_isPythonScalar(o)) { - - if (PyArray_IsScalar(o, String)) - return PyBobIoHDF5File_setStringType(t, o); - - else if (PyBool_Check(o)) - return PyBobIoHDF5File_setType<bool>(t); - -#if PY_VERSION_HEX < 0x03000000 - else if (PyString_Check(o)) - return PyBobIoHDF5File_setStringType(t, o); - -#else - else if (PyBytes_Check(o)) - return PyBobIoHDF5File_setStringType(t, o); - -#endif - else if (PyUnicode_Check(o)) - return PyBobIoHDF5File_setStringType(t, o); - -#if PY_VERSION_HEX < 0x03000000 - else if (PyInt_Check(o)) - return PyBobIoHDF5File_setType<int32_t>(t); - -#endif - else if (PyLong_Check(o)) - return PyBobIoHDF5File_setType<int64_t>(t); - - else if (PyFloat_Check(o)) - return PyBobIoHDF5File_setType<double>(t); - - else if (PyComplex_Check(o)) - return PyBobIoHDF5File_setType<std::complex<double> >(t); - - else if (PyArray_IsScalar(o, Bool)) - return PyBobIoHDF5File_setType<bool>(t); - - else if (PyArray_IsScalar(o, Int8)) - return PyBobIoHDF5File_setType<int8_t>(t); - - else if (PyArray_IsScalar(o, UInt8)) - return PyBobIoHDF5File_setType<uint8_t>(t); - - else if (PyArray_IsScalar(o, Int16)) - return PyBobIoHDF5File_setType<int16_t>(t); - - else if (PyArray_IsScalar(o, UInt16)) - return PyBobIoHDF5File_setType<uint16_t>(t); - - else if (PyArray_IsScalar(o, Int32)) - return PyBobIoHDF5File_setType<int32_t>(t); - - else if (PyArray_IsScalar(o, UInt32)) - return PyBobIoHDF5File_setType<uint32_t>(t); - - else if (PyArray_IsScalar(o, Int64)) - return PyBobIoHDF5File_setType<int64_t>(t); - - else if (PyArray_IsScalar(o, UInt64)) - return PyBobIoHDF5File_setType<uint64_t>(t); - - else if (PyArray_IsScalar(o, Float)) - return PyBobIoHDF5File_setType<float>(t); - - else if (PyArray_IsScalar(o, Double)) - return PyBobIoHDF5File_setType<double>(t); - - else if (PyArray_IsScalar(o, LongDouble)) - return PyBobIoHDF5File_setType<long double>(t); - - else if (PyArray_IsScalar(o, CFloat)) - return PyBobIoHDF5File_setType<std::complex<float> >(t); - - else if (PyArray_IsScalar(o, CDouble)) - return PyBobIoHDF5File_setType<std::complex<double> >(t); - - else if (PyArray_IsScalar(o, CLongDouble)) - return PyBobIoHDF5File_setType<std::complex<long double> >(t); - - //if you get to this, point, it is an unsupported scalar - return -1; - - } - - else if (PyBlitzArray_Check(o)) { - - PyBlitzArrayObject* bz = reinterpret_cast<PyBlitzArrayObject*>(o); - bob::io::base::hdf5type h5type = PyBobIo_H5FromTypenum(bz->type_num); - if (h5type == bob::io::base::unsupported) return -1; - bob::io::base::HDF5Shape h5shape(bz->ndim, bz->shape); - t = bob::io::base::HDF5Type(h5type, h5shape); - return 1; - - } - - else if (PyArray_CheckExact(o) && PyArray_ISCARRAY_RO((PyArrayObject*)o)) { - - PyArrayObject* np = reinterpret_cast<PyArrayObject*>(o); - bob::io::base::hdf5type h5type = PyBobIo_H5FromTypenum(PyArray_DESCR(np)->type_num); - if (h5type == bob::io::base::unsupported) return -1; - bob::io::base::HDF5Shape h5shape(PyArray_NDIM(np), PyArray_DIMS(np)); - t = bob::io::base::HDF5Type(h5type, h5shape); - return 2; - - } - - else if (converted) { - - *converted = PyArray_FromAny(o, 0, 1, 0, -#if NPY_FEATURE_VERSION >= NUMPY17_API /* NumPy C-API version >= 1.7 */ - NPY_ARRAY_CARRAY_RO, -# else - NPY_CARRAY_RO, -# endif - 0); - if (!*converted) return -1; ///< error condition - - PyArrayObject* np = reinterpret_cast<PyArrayObject*>(*converted); - bob::io::base::hdf5type h5type = PyBobIo_H5FromTypenum(PyArray_DESCR(np)->type_num); - if (h5type == bob::io::base::unsupported) { - Py_CLEAR(*converted); - return -1; - } - bob::io::base::HDF5Shape h5shape(PyArray_NDIM(np), PyArray_DIMS(np)); - t = bob::io::base::HDF5Type(h5type, h5shape); - return 3; - - } - - //if you get to this, point, it is an unsupported type - return -1; - -} - -template <typename T> -static PyObject* PyBobIoHDF5File_replaceScalar(PyBobIoHDF5FileObject* self, - const char* path, Py_ssize_t pos, PyObject* o) { - - T value = PyBlitzArrayCxx_AsCScalar<T>(o); - if (PyErr_Occurred()) return 0; - self->f->replace(path, pos, value); - - Py_RETURN_NONE; - -} - - -static auto s_replace = bob::extension::FunctionDoc( - "replace", - "Modifies the value of a scalar/array in a dataset.", - 0, - true -) -.add_prototype("path, pos, data") -.add_parameter("path", "str", "The path to the dataset to read data from; can be an absolute value (starting with a leading ``'/'``) or relative to the current working directory :py:attr:`cwd`") -.add_parameter("pos", "int", "Position, within the dataset, of the object to be replaced; the object position on the dataset must exist, or an exception is raised") -.add_parameter("data", ":py:class:`numpy.ndarray` or scalar", "Object to replace the value with; this value must be compatible with the typing information on the dataset, or an exception will be raised") -; -static PyObject* PyBobIoHDF5File_replace(PyBobIoHDF5FileObject* self, PyObject* args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_replace.kwlist(); - - const char* path = 0; - Py_ssize_t pos = -1; - PyObject* data = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "snO", kwlist, &path, &pos, &data)) return 0; - - bob::io::base::HDF5Type type; - PyObject* converted = 0; - int is_array = PyBobIoHDF5File_getObjectType(data, type, &converted); - auto converted_ = make_xsafe(converted); - - if (is_array < 0) { ///< error condition, signal - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_TypeError, "error replacing position %" PY_FORMAT_SIZE_T "d of dataset `%s' at HDF5 file `%s': no support for storing objects of type `%s' on HDF5 files", pos, path, filename, Py_TYPE(data)->tp_name); - return 0; - } - - if (!is_array) { //write as a scalar - - switch(type.type()) { - case bob::io::base::s: - { - auto value = PyBobIo_GetString(data); - if (!value) return 0; - self->f->replace<std::string>(path, pos, value.get()); - Py_RETURN_NONE; - } - case bob::io::base::b: - return PyBobIoHDF5File_replaceScalar<bool>(self, path, pos, data); - case bob::io::base::i8: - return PyBobIoHDF5File_replaceScalar<int8_t>(self, path, pos, data); - case bob::io::base::i16: - return PyBobIoHDF5File_replaceScalar<int16_t>(self, path, pos, data); - case bob::io::base::i32: - return PyBobIoHDF5File_replaceScalar<int32_t>(self, path, pos, data); - case bob::io::base::i64: - return PyBobIoHDF5File_replaceScalar<int64_t>(self, path, pos, data); - case bob::io::base::u8: - return PyBobIoHDF5File_replaceScalar<uint8_t>(self, path, pos, data); - case bob::io::base::u16: - return PyBobIoHDF5File_replaceScalar<uint16_t>(self, path, pos, data); - case bob::io::base::u32: - return PyBobIoHDF5File_replaceScalar<uint32_t>(self, path, pos, data); - case bob::io::base::u64: - return PyBobIoHDF5File_replaceScalar<uint64_t>(self, path, pos, data); - case bob::io::base::f32: - return PyBobIoHDF5File_replaceScalar<float>(self, path, pos, data); - case bob::io::base::f64: - return PyBobIoHDF5File_replaceScalar<double>(self, path, pos, data); - case bob::io::base::f128: - return PyBobIoHDF5File_replaceScalar<long double>(self, path, pos, data); - case bob::io::base::c64: - return PyBobIoHDF5File_replaceScalar<std::complex<float> >(self, path, pos, data); - case bob::io::base::c128: - return PyBobIoHDF5File_replaceScalar<std::complex<double> >(self, path, pos, data); - case bob::io::base::c256: - return PyBobIoHDF5File_replaceScalar<std::complex<long double> >(self, path, pos, data); - default: - break; - } - - } - - else { //write as array - - switch (is_array) { - case 1: //bob.blitz.array - self->f->write_buffer(path, pos, type, ((PyBlitzArrayObject*)data)->data); - break; - - case 2: //numpy.ndarray - self->f->write_buffer(path, pos, type, PyArray_DATA((PyArrayObject*)data)); - break; - - case 3: //converted numpy.ndarray - self->f->write_buffer(path, pos, type, PyArray_DATA((PyArrayObject*)converted)); - break; - - default: - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_NotImplementedError, "error replacing position %" PY_FORMAT_SIZE_T "d of dataset `%s' at HDF5 file `%s': HDF5 replace function is uncovered for array type %d (DEBUG ME)", pos, path, filename, is_array); - return 0; - } - - } - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_replace.name()).c_str(), 0) -} - - -template <typename T> -static int PyBobIoHDF5File_appendScalar(PyBobIoHDF5FileObject* self, - const char* path, PyObject* o) { - - T value = PyBlitzArrayCxx_AsCScalar<T>(o); - if (PyErr_Occurred()) return 0; - self->f->append(path, value); - - return 1; - -} - -static int PyBobIoHDF5File_innerAppend(PyBobIoHDF5FileObject* self, const char* path, PyObject* data, Py_ssize_t compression) { - - bob::io::base::HDF5Type type; - PyObject* converted = 0; - int is_array = PyBobIoHDF5File_getObjectType(data, type, &converted); - auto converted_ = make_xsafe(converted); - - if (is_array < 0) { ///< error condition, signal - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_TypeError, "error appending to object `%s' of HDF5 file `%s': no support for storing objects of type `%s' on HDF5 files", path, filename, Py_TYPE(data)->tp_name); - return 0; - } - - try { - - if (!is_array) { //write as a scalar - - switch(type.type()) { - case bob::io::base::s: - { - auto value = PyBobIo_GetString(data); - if (!value) return 0; - self->f->append<std::string>(path, value.get()); - return 1; - } - case bob::io::base::b: - return PyBobIoHDF5File_appendScalar<bool>(self, path, data); - case bob::io::base::i8: - return PyBobIoHDF5File_appendScalar<int8_t>(self, path, data); - case bob::io::base::i16: - return PyBobIoHDF5File_appendScalar<int16_t>(self, path, data); - case bob::io::base::i32: - return PyBobIoHDF5File_appendScalar<int32_t>(self, path, data); - case bob::io::base::i64: - return PyBobIoHDF5File_appendScalar<int64_t>(self, path, data); - case bob::io::base::u8: - return PyBobIoHDF5File_appendScalar<uint8_t>(self, path, data); - case bob::io::base::u16: - return PyBobIoHDF5File_appendScalar<uint16_t>(self, path, data); - case bob::io::base::u32: - return PyBobIoHDF5File_appendScalar<uint32_t>(self, path, data); - case bob::io::base::u64: - return PyBobIoHDF5File_appendScalar<uint64_t>(self, path, data); - case bob::io::base::f32: - return PyBobIoHDF5File_appendScalar<float>(self, path, data); - case bob::io::base::f64: - return PyBobIoHDF5File_appendScalar<double>(self, path, data); - case bob::io::base::f128: - return PyBobIoHDF5File_appendScalar<long double>(self, path, data); - case bob::io::base::c64: - return PyBobIoHDF5File_appendScalar<std::complex<float> >(self, path, data); - case bob::io::base::c128: - return PyBobIoHDF5File_appendScalar<std::complex<double> >(self, path, data); - case bob::io::base::c256: - return PyBobIoHDF5File_appendScalar<std::complex<long double> >(self, path, data); - default: - break; - } - - } - - else { //write as array - - switch (is_array) { - case 1: //bob.blitz.array - if (!self->f->contains(path)) self->f->create(path, type, true, compression); - self->f->extend_buffer(path, type, ((PyBlitzArrayObject*)data)->data); - break; - - case 2: //numpy.ndarray - if (!self->f->contains(path)) self->f->create(path, type, true, compression); - self->f->extend_buffer(path, type, PyArray_DATA((PyArrayObject*)data)); - break; - - case 3: //converted numpy.ndarray - if (!self->f->contains(path)) self->f->create(path, type, true, compression); - self->f->extend_buffer(path, type, PyArray_DATA((PyArrayObject*)converted)); - break; - - default:{ - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_NotImplementedError, "error appending to object `%s' at HDF5 file `%s': HDF5 replace function is uncovered for array type %d (DEBUG ME)", path, filename, is_array); - return 0; - } - } - - } - - } - catch (std::exception& e) { - PyErr_SetString(PyExc_RuntimeError, e.what()); - return 0; - } - catch (...) { - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_RuntimeError, "cannot append to object `%s' at HDF5 file `%s': unknown exception caught", path, filename); - return 0; - } - - return 1; - -} - - -static auto s_append = bob::extension::FunctionDoc( - "append", - "Appends a scalar or an array to a dataset", - "The object must be compatible with the typing information on the dataset, or an exception will be raised. " - "You can also, optionally, set this to an iterable of scalars or arrays. " - "This will cause this method to iterate over the elements and add each individually.\n\n" - "The ``compression`` parameter is effective when appending arrays. " - "Set this to a number betwen 0 (default) and 9 (maximum) to compress the contents of this dataset. " - "This setting is only effective if the dataset does not yet exist, otherwise, the previous setting is respected.", - true -) -.add_prototype("path, data, [compression]") -.add_parameter("path", "str", "The path to the dataset to append data at; can be an absolute value (starting with a leading ``'/'``) or relative to the current working directory :py:attr:`cwd`") -.add_parameter("data", ":py:class:`numpy.ndarray` or scalar", "Object to append to the dataset") -.add_parameter("compression", "int", "A compression value between 0 and 9") -; -static PyObject* PyBobIoHDF5File_append(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_append.kwlist(); - - char* path = 0; - PyObject* data = 0; - Py_ssize_t compression = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "sO|n", kwlist, &path, &data, &compression)) return 0; - - if (compression < 0 || compression > 9) { - PyErr_SetString(PyExc_ValueError, "compression should be set to an integer value between and including 0 and 9"); - return 0; - } - - // special case: user passes a tuple or list of arrays or scalars to append - if (PyTuple_Check(data) || PyList_Check(data)) { - PyObject* iter = PyObject_GetIter(data); - if (!iter) return 0; - auto iter_ = make_safe(iter); - while (PyObject* item = PyIter_Next(iter)) { - auto item_ = make_safe(item); - int ok = PyBobIoHDF5File_innerAppend(self, path, item, compression); - if (!ok) return 0; - } - Py_RETURN_NONE; - } - - int ok = PyBobIoHDF5File_innerAppend(self, path, data, compression); - if (!ok) return 0; - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_append.name()).c_str(), 0) -} - - -template <typename T> -static PyObject* PyBobIoHDF5File_setScalar(PyBobIoHDF5FileObject* self, - const char* path, PyObject* o) { - - T value = PyBlitzArrayCxx_AsCScalar<T>(o); - if (PyErr_Occurred()) return 0; - self->f->set(path, value); - - Py_RETURN_NONE; - -} - - -static auto s_set = bob::extension::FunctionDoc( - "set", - "Sets the scalar or array at position 0 to the given value", - "This method is equivalent to checking if the scalar or array at position 0 exists and then replacing it. " - "If the path does not exist, we append the new scalar or array.\n\n" - "The ``data`` must be compatible with the typing information on the dataset, or an exception will be raised. " - "You can also, optionally, set this to an iterable of scalars or arrays. " - "This will cause this method to iterate over the elements and add each individually.\n\n" - "The ``compression`` parameter is effective when writing arrays. " - "Set this to a number betwen 0 (default) and 9 (maximum) to compress the contents of this dataset. " - "This setting is only effective if the dataset does not yet exist, otherwise, the previous setting is respected.\n\n" - ".. note:: The functions :py:meth:`set` and :py:meth:`write` are synonyms.", - true -) -.add_prototype("path, data, [compression]") -.add_parameter("path", "str", "The path to the dataset to write data to; can be an absolute value (starting with a leading ``'/'``) or relative to the current working directory :py:attr:`cwd`") -.add_parameter("data", ":py:class:`numpy.ndarray` or scalar", "Object to write to the dataset") -.add_parameter("compression", "int", "A compression value between 0 and 9") -; -auto s_write = s_set.clone("write"); -static PyObject* PyBobIoHDF5File_set(PyBobIoHDF5FileObject* self, PyObject* args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static const char* const_kwlist[] = {"path", "data", "compression", 0}; - static char** kwlist = const_cast<char**>(const_kwlist); - - char* path = 0; - PyObject* data = 0; - Py_ssize_t compression = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "sO|n", kwlist, &path, &data, &compression)) return 0; - - if (compression < 0 || compression > 9) { - PyErr_SetString(PyExc_ValueError, "compression should be set to an integer value between and including 0 and 9"); - return 0; - } - - bob::io::base::HDF5Type type; - PyObject* converted = 0; - int is_array = PyBobIoHDF5File_getObjectType(data, type, &converted); - auto converted_ = make_xsafe(converted); - - if (is_array < 0) { ///< error condition, signal - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_TypeError, "error setting object `%s' of HDF5 file `%s': no support for storing objects of type `%s' on HDF5 files", path, filename, Py_TYPE(data)->tp_name); - return 0; - } - - if (!is_array) { //write as a scalar - - switch(type.type()) { - case bob::io::base::s: - { - auto value = PyBobIo_GetString(data); - if (!value) return 0; - self->f->set<std::string>(path, value.get()); - Py_RETURN_NONE; - } - break; - case bob::io::base::b: - return PyBobIoHDF5File_setScalar<bool>(self, path, data); - case bob::io::base::i8: - return PyBobIoHDF5File_setScalar<int8_t>(self, path, data); - case bob::io::base::i16: - return PyBobIoHDF5File_setScalar<int16_t>(self, path, data); - case bob::io::base::i32: - return PyBobIoHDF5File_setScalar<int32_t>(self, path, data); - case bob::io::base::i64: - return PyBobIoHDF5File_setScalar<int64_t>(self, path, data); - case bob::io::base::u8: - return PyBobIoHDF5File_setScalar<uint8_t>(self, path, data); - case bob::io::base::u16: - return PyBobIoHDF5File_setScalar<uint16_t>(self, path, data); - case bob::io::base::u32: - return PyBobIoHDF5File_setScalar<uint32_t>(self, path, data); - case bob::io::base::u64: - return PyBobIoHDF5File_setScalar<uint64_t>(self, path, data); - case bob::io::base::f32: - return PyBobIoHDF5File_setScalar<float>(self, path, data); - case bob::io::base::f64: - return PyBobIoHDF5File_setScalar<double>(self, path, data); - case bob::io::base::f128: - return PyBobIoHDF5File_setScalar<long double>(self, path, data); - case bob::io::base::c64: - return PyBobIoHDF5File_setScalar<std::complex<float> >(self, path, data); - case bob::io::base::c128: - return PyBobIoHDF5File_setScalar<std::complex<double> >(self, path, data); - case bob::io::base::c256: - return PyBobIoHDF5File_setScalar<std::complex<long double> >(self, path, data); - default: - break; - } - - } - - else { //write as array - - switch (is_array) { - case 1: //bob.blitz.array - if (!self->f->contains(path)) self->f->create(path, type, false, compression); - self->f->write_buffer(path, 0, type, ((PyBlitzArrayObject*)data)->data); - break; - - case 2: //numpy.ndarray - if (!self->f->contains(path)) self->f->create(path, type, false, compression); - self->f->write_buffer(path, 0, type, PyArray_DATA((PyArrayObject*)data)); - break; - - case 3: //converted numpy.ndarray - if (!self->f->contains(path)) self->f->create(path, type, false, compression); - self->f->write_buffer(path, 0, type, PyArray_DATA((PyArrayObject*)converted)); - break; - - default: - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_NotImplementedError, "error setting object `%s' at HDF5 file `%s': HDF5 replace function is uncovered for array type %d (DEBUG ME)", path, filename, is_array); - return 0; - } - - } - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_set.name()).c_str(), 0) -} - - -static auto s_copy = bob::extension::FunctionDoc( - "copy", - "Copies all accessible content to another HDF5 file", - "Unlinked contents of this file will not be copied. " - "This can be used as a method to trim unwanted content in a file.", - true -) -.add_prototype("hdf5") -.add_parameter("hdf5", ":py:class:`HDF5File`", "The HDF5 file (already opened for writing), to copy the contents to") -; -static PyObject* PyBobIoHDF5File_copy(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_copy.kwlist(); - - PyBobIoHDF5FileObject* other = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&", kwlist, &PyBobIoHDF5File_Converter, &other)) return 0; - - self->f->copy(*other->f); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_copy.name()).c_str(), 0) -} - - -template <typename T> static PyObject* PyBobIoHDF5File_readScalarAttribute -(PyBobIoHDF5FileObject* self, const char* path, const char* name, - const bob::io::base::HDF5Type& type) { - T value; - self->f->read_attribute(path, name, type, static_cast<void*>(&value)); - return PyBlitzArrayCxx_FromCScalar(value); -} - -template <> PyObject* PyBobIoHDF5File_readScalarAttribute<const char*> -(PyBobIoHDF5FileObject* self, const char* path, const char* name, - const bob::io::base::HDF5Type& type) { - std::string retval; - self->f->getAttribute(path, name, retval); - return Py_BuildValue("s", retval.c_str()); -} - -static PyObject* PyBobIoHDF5File_readAttribute(PyBobIoHDF5FileObject* self, - const char* path, const char* name, const bob::io::base::HDF5Type& type) { - - //no error detection: this should be done before reaching this method - - const bob::io::base::HDF5Shape& shape = type.shape(); - - if (type.type() == bob::io::base::s || (shape.n() == 1 && shape[0] == 1)) { - //read as scalar - switch(type.type()) { - case bob::io::base::s: - return PyBobIoHDF5File_readScalarAttribute<const char*>(self, path, name, type); - case bob::io::base::b: - return PyBobIoHDF5File_readScalarAttribute<bool>(self, path, name, type); - case bob::io::base::i8: - return PyBobIoHDF5File_readScalarAttribute<int8_t>(self, path, name, type); - case bob::io::base::i16: - return PyBobIoHDF5File_readScalarAttribute<int16_t>(self, path, name, type); - case bob::io::base::i32: - return PyBobIoHDF5File_readScalarAttribute<int32_t>(self, path, name, type); - case bob::io::base::i64: - return PyBobIoHDF5File_readScalarAttribute<int64_t>(self, path, name, type); - case bob::io::base::u8: - return PyBobIoHDF5File_readScalarAttribute<uint8_t>(self, path, name, type); - case bob::io::base::u16: - return PyBobIoHDF5File_readScalarAttribute<uint16_t>(self, path, name, type); - case bob::io::base::u32: - return PyBobIoHDF5File_readScalarAttribute<uint32_t>(self, path, name, type); - case bob::io::base::u64: - return PyBobIoHDF5File_readScalarAttribute<uint64_t>(self, path, name, type); - case bob::io::base::f32: - return PyBobIoHDF5File_readScalarAttribute<float>(self, path, name, type); - case bob::io::base::f64: - return PyBobIoHDF5File_readScalarAttribute<double>(self, path, name, type); - case bob::io::base::f128: - return PyBobIoHDF5File_readScalarAttribute<long double>(self, path, name, type); - case bob::io::base::c64: - return PyBobIoHDF5File_readScalarAttribute<std::complex<float> >(self, path, name, type); - case bob::io::base::c128: - return PyBobIoHDF5File_readScalarAttribute<std::complex<double> >(self, path, name, type); - case bob::io::base::c256: - return PyBobIoHDF5File_readScalarAttribute<std::complex<long double> >(self, path, name, type); - default: - break; - } - } - - //read as an numpy array - int type_num = PyBobIo_H5AsTypenum(type.type()); - if (type_num == NPY_NOTYPE) return 0; ///< failure - - npy_intp pyshape[NPY_MAXDIMS]; - for (size_t k=0; k<shape.n(); ++k) pyshape[k] = shape.get()[k]; - - PyObject* retval = PyArray_SimpleNew(shape.n(), pyshape, type_num); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - self->f->read_attribute(path, name, type, PyArray_DATA((PyArrayObject*)retval)); - - return Py_BuildValue("O", retval); -} - - -static auto s_get_attribute = bob::extension::FunctionDoc( - "get_attribute", - "Retrieve a given attribute from the named resource", - "This method returns a single value corresponding to what is stored inside the attribute container for the given resource. " - "If you would like to retrieve all attributes at once, use :py:meth:`get_attributes` instead.", - true -) -.add_prototype("name, [path]", "attribute") -.add_parameter("name", "str", "The name of the attribute to retrieve; if the attribute is not available, a ``RuntimeError`` is raised") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to get an attribute from; if the path does not exist, a ``RuntimeError`` is raised") -.add_return("attribute", ":py:class:`numpy.ndarray` or scalar", "The read attribute") -; -static PyObject* PyBobIoHDF5File_getAttribute(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_get_attribute.kwlist(); - - const char* name = 0; - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|s", kwlist, &name, &path)) return 0; - - bob::io::base::HDF5Type type; - - self->f->getAttributeType(path, name, type); - - if (type.type() == bob::io::base::unsupported) { - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - boost::format m("unsupported HDF5 data type detected for attribute `%s' at path `%s' of file `%s' - returning None"); - m % name % path % filename; - PyErr_Warn(PyExc_UserWarning, m.str().c_str()); - Py_RETURN_NONE; - } - - return PyBobIoHDF5File_readAttribute(self, path, name, type); -BOB_CATCH_MEMBER(exception_message(self, s_get_attribute.name()).c_str(), 0) -} - - -static auto s_get_attributes = bob::extension::FunctionDoc( - "get_attributes", - "Reads all attributes of the given path", - "Attributes are returned in a dictionary in which each key corresponds to the attribute name and each value corresponds to the value stored inside the HDF5 file. " - "To retrieve only a specific attribute, use :py:meth:`get_attribute`.", - true -) -.add_prototype("[path]", "attributes") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to get all attributes from; if the path does not exist, a ``RuntimeError`` is raised.") -.add_return("attributes", "{str:value}", "The attributes organized in dictionary, where ``value`` might be a :py:class:`numpy.ndarray` or a scalar") -; -static PyObject* PyBobIoHDF5File_getAttributes(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_get_attributes.kwlist(); - - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, &path)) return 0; - - std::map<std::string, bob::io::base::HDF5Type> attributes; - self->f->listAttributes(path, attributes); - PyObject* retval = PyDict_New(); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - for (auto k=attributes.begin(); k!=attributes.end(); ++k) { - PyObject* item = 0; - if (k->second.type() == bob::io::base::unsupported) { - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - boost::format m("unsupported HDF5 data type detected for attribute `%s' at path `%s' of file `%s' - returning None"); - m % k->first % k->second.str() % filename; - PyErr_Warn(PyExc_UserWarning, m.str().c_str()); - item = Py_BuildValue(""); - } - else item = PyBobIoHDF5File_readAttribute(self, path, k->first.c_str(), k->second); - - if (!item) return 0; - auto item_ = make_safe(item); - - if (PyDict_SetItemString(retval, k->first.c_str(), item) != 0) return 0; - } - - return Py_BuildValue("O", retval); -BOB_CATCH_MEMBER(exception_message(self, s_get_attributes.name()).c_str(), 0) -} - - -template <typename T> PyObject* PyBobIoHDF5File_writeScalarAttribute(PyBobIoHDF5FileObject* self, const char* path, const char* name, const bob::io::base::HDF5Type& type, PyObject* o) { - T value = PyBlitzArrayCxx_AsCScalar<T>(o); - if (PyErr_Occurred()) return 0; - - self->f->write_attribute(path, name, type, static_cast<void*>(&value)); - - Py_RETURN_NONE; -} - -template <> PyObject* PyBobIoHDF5File_writeScalarAttribute<const char*>(PyBobIoHDF5FileObject* self, const char* path, const char* name, const bob::io::base::HDF5Type& type, PyObject* o) { - auto value = PyBobIo_GetString(o); - if (!value) return 0; - self->f->write_attribute(path, name, type, static_cast<const void*>(value.get())); - Py_RETURN_NONE; -} - -static PyObject* PyBobIoHDF5File_writeAttribute(PyBobIoHDF5FileObject* self, - const char* path, const char* name, const bob::io::base::HDF5Type& type, - PyObject* o, int is_array, PyObject* converted) { - - //no error detection: this should be done before reaching this method - - if (!is_array) { //write as a scalar - switch(type.type()) { - case bob::io::base::s: - return PyBobIoHDF5File_writeScalarAttribute<const char*>(self, path, name, type, o); - case bob::io::base::b: - return PyBobIoHDF5File_writeScalarAttribute<bool>(self, path, name, type, o); - case bob::io::base::i8: - return PyBobIoHDF5File_writeScalarAttribute<int8_t>(self, path, name, type, o); - case bob::io::base::i16: - return PyBobIoHDF5File_writeScalarAttribute<int16_t>(self, path, name, type, o); - case bob::io::base::i32: - return PyBobIoHDF5File_writeScalarAttribute<int32_t>(self, path, name, type, o); - case bob::io::base::i64: - return PyBobIoHDF5File_writeScalarAttribute<int64_t>(self, path, name, type, o); - case bob::io::base::u8: - return PyBobIoHDF5File_writeScalarAttribute<uint8_t>(self, path, name, type, o); - case bob::io::base::u16: - return PyBobIoHDF5File_writeScalarAttribute<uint16_t>(self, path, name, type, o); - case bob::io::base::u32: - return PyBobIoHDF5File_writeScalarAttribute<uint32_t>(self, path, name, type, o); - case bob::io::base::u64: - return PyBobIoHDF5File_writeScalarAttribute<uint64_t>(self, path, name, type, o); - case bob::io::base::f32: - return PyBobIoHDF5File_writeScalarAttribute<float>(self, path, name, type, o); - case bob::io::base::f64: - return PyBobIoHDF5File_writeScalarAttribute<double>(self, path, name, type, o); - case bob::io::base::f128: - return PyBobIoHDF5File_writeScalarAttribute<long double>(self, path, name, type, o); - case bob::io::base::c64: - return PyBobIoHDF5File_writeScalarAttribute<std::complex<float> >(self, path, name, type, o); - case bob::io::base::c128: - return PyBobIoHDF5File_writeScalarAttribute<std::complex<double> >(self, path, name, type, o); - case bob::io::base::c256: - return PyBobIoHDF5File_writeScalarAttribute<std::complex<long double> >(self, path, name, type, o); - default: - break; - } - } - - else { //write as an numpy array - - switch (is_array) { - - case 1: //bob.blitz.array - self->f->write_attribute(path, name, type, ((PyBlitzArrayObject*)o)->data); - break; - - case 2: //numpy.ndarray - self->f->write_attribute(path, name, type, PyArray_DATA((PyArrayObject*)o)); - break; - - case 3: //converted numpy.ndarray - self->f->write_attribute(path, name, type, PyArray_DATA((PyArrayObject*)converted)); - break; - - default:{ - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_NotImplementedError, "error setting attribute `%s' at resource `%s' of HDF5 file `%s': HDF5 attribute setting function is uncovered for array type %d (DEBUG ME)", name, path, filename, is_array); - return 0; - } - } - } - Py_RETURN_NONE; -} - -static auto s_set_attribute = bob::extension::FunctionDoc( - "set_attribute", - "Sets a given attribute at the named resource", - "Only simple scalars (booleans, integers, floats and complex numbers) and arrays of those are supported at the time being. " - "You can use :py:mod:`numpy` scalars to set values with arbitrary precision (e.g. :py:class:`numpy.uint8`).\n\n" - ".. warning:: Attributes in HDF5 files are supposed to be small containers or simple scalars that provide extra information about the data stored on the main resource (dataset or group|directory). " - "Attributes cannot be retrieved in chunks, contrary to data in datasets. " - "Currently, **no limitations** for the size of values stored on attributes is imposed.", - true -) -.add_prototype("name, value, [path]") -.add_parameter("name", "str", "The name of the attribute to set") -.add_parameter("value", ":py:class:`numpy.ndarray` or scalar", "A simple scalar to set for the given attribute on the named resources ``path``") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to set an attribute at") -; -static PyObject* PyBobIoHDF5File_setAttribute(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_set_attribute.kwlist(); - - const char* name = 0; - PyObject* value = 0; - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "sO|s", kwlist, &name, &value, &path)) return 0; - - bob::io::base::HDF5Type type; - PyObject* converted = 0; - int is_array = PyBobIoHDF5File_getObjectType(value, type, &converted); - auto converted_ = make_xsafe(converted); - - if (is_array < 0) { ///< error condition, signal - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_TypeError, "error setting attribute `%s' of resource `%s' at HDF5 file `%s': no support for storing objects of type `%s' on HDF5 files", name, path, filename, Py_TYPE(value)->tp_name); - return 0; - } - - return PyBobIoHDF5File_writeAttribute(self, path, name, type, value, is_array, converted); -BOB_CATCH_MEMBER(exception_message(self, s_set_attribute.name()).c_str(), 0) -} - - -static auto s_set_attributes = bob::extension::FunctionDoc( - "set_attributes", - "Sets several attribute at the named resource using a dictionary", - "Each value in the dictionary should be simple scalars (booleans, integers, floats and complex numbers) or arrays of those are supported at the time being. " - "You can use :py:mod:`numpy` scalars to set values with arbitrary precision (e.g. :py:class:`numpy.uint8`).\n\n" - ".. warning:: Attributes in HDF5 files are supposed to be small containers or simple scalars that provide extra information about the data stored on the main resource (dataset or group|directory). " - "Attributes cannot be retrieved in chunks, contrary to data in datasets. " - "Currently, **no limitations** for the size of values stored on attributes is imposed.", - true -) -.add_prototype("attributes, [path]") -.add_parameter("attributes", "{str: value}", "A python dictionary containing pairs of strings and values, which can be a py:class:`numpy.ndarray` or a scalar") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to set attributes at") -; -static PyObject* PyBobIoHDF5File_setAttributes(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_set_attributes.kwlist(); - - PyObject* attrs = 0; - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s", kwlist, &attrs, &path)) return 0; - - if (!PyDict_Check(attrs)) { - PyErr_Format(PyExc_TypeError, "parameter `%s' should be a dictionary where keys are strings and values are the attribute values", kwlist[0]); - return 0; - } - - PyObject *key, *value; - Py_ssize_t pos = 0; - while (PyDict_Next(attrs, &pos, &key, &value)) { - bob::io::base::HDF5Type type; - PyObject* converted = 0; - - auto name = PyBobIo_GetString(key); - if (!name) return 0; - - int is_array = PyBobIoHDF5File_getObjectType(value, type, &converted); - auto converted_ = make_xsafe(converted); - - if (is_array < 0) { ///< error condition, signal - const char* filename = "<unknown>"; - try{ filename = self->f->filename().c_str(); } catch(...){} - PyErr_Format(PyExc_TypeError, "error setting attribute `%s' of resource `%s' at HDF5 file `%s': no support for storing objects of type `%s' on HDF5 files", name.get(), path, filename, Py_TYPE(value)->tp_name); - return 0; - } - - PyObject* retval = PyBobIoHDF5File_writeAttribute(self, path, name.get(), type, value, is_array, converted); - if (!retval) return 0; - Py_DECREF(retval); - - } - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_set_attributes.name()).c_str(), 0) -} - - -static auto s_del_attribute = bob::extension::FunctionDoc( - "del_attribute", - "Removes a given attribute at the named resource", - 0, - true -) -.add_prototype("name, [path]") -.add_parameter("name", "str", "The name of the attribute to delete; if the attribute is not available, a ``RuntimeError`` is raised") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to delete an attribute from; if the path does not exist, a ``RuntimeError`` is raised") -; -static PyObject* PyBobIoHDF5File_delAttribute(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_del_attribute.kwlist(); - - const char* name = 0; - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|s", kwlist, &name, &path)) return 0; - - self->f->deleteAttribute(path, name); - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_del_attribute.name()).c_str(), 0) -} - - -static auto s_del_attributes = bob::extension::FunctionDoc( - "del_attributes", - "Removes attributes in a given (existing) path", - "If the ``attributes`` are not given or set to ``None``, then remove all attributes at the named resource.", - true -) -.add_prototype("[attributes], [path]") -.add_parameter("attributes", "[str] or None", "[Default: ``None``] An iterable containing the names of the attributes to be removed, or ``None``") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to delete attributes from; if the path does not exist, a ``RuntimeError`` is raised") -; -static PyObject* PyBobIoHDF5File_delAttributes(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_del_attributes.kwlist(); - - PyObject* attrs = 0; - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Os", kwlist, &attrs, &path)) return 0; - - if (attrs && !PyIter_Check(attrs)) { - PyErr_Format(PyExc_TypeError, "parameter `%s', if set, must be an iterable of strings", kwlist[0]); - return 0; - } - - if (attrs) { - PyObject* iter = PyObject_GetIter(attrs); - if (!iter) return 0; - auto iter_ = make_safe(iter); - while (PyObject* item = PyIter_Next(iter)) { - auto item_ = make_safe(item); - auto name = PyBobIo_GetString(item); - if (!name) return 0; - self->f->deleteAttribute(path, name.get()); - } - Py_RETURN_NONE; - } - - //else, find the attributes and remove all of them - std::map<std::string, bob::io::base::HDF5Type> attributes; - self->f->listAttributes(path, attributes); - for (auto k=attributes.begin(); k!=attributes.end(); ++k) { - self->f->deleteAttribute(path, k->first); - } - - Py_RETURN_NONE; -BOB_CATCH_MEMBER(exception_message(self, s_del_attributes.name()).c_str(), 0) -} - - -static auto s_has_attribute = bob::extension::FunctionDoc( - "has_attribute", - "Checks existence of a given attribute at the named resource", - 0, - true -) -.add_prototype("name, [path]", "existence") -.add_parameter("name", "str", "The name of the attribute to check") -.add_parameter("path", "str", "[Default: ``'.'``] The path leading to the resource (dataset or group|directory) you would like to delete attributes from; if the path does not exist, a ``RuntimeError`` is raised") -.add_return("existence", "bool", "``True``, if the attribute ``name`` exists, otherwise ``False``") -; -static PyObject* PyBobIoHDF5File_hasAttribute(PyBobIoHDF5FileObject* self, PyObject *args, PyObject* kwds) { -BOB_TRY - /* Parses input arguments in a single shot */ - static char** kwlist = s_has_attribute.kwlist(); - - const char* name = 0; - const char* path = "."; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|s", kwlist, &name, &path)) return 0; - - if (self->f->hasAttribute(path, name)) - Py_RETURN_TRUE; - Py_RETURN_FALSE; - -BOB_CATCH_MEMBER(exception_message(self, s_has_attribute.name()).c_str(), 0) -} - - -static PyMethodDef PyBobIoHDF5File_methods[] = { - { - s_close.name(), - (PyCFunction)PyBobIoHDF5File_close, - METH_VARARGS|METH_KEYWORDS, - s_close.doc() - }, - { - s_flush.name(), - (PyCFunction)PyBobIoHDF5File_flush, - METH_VARARGS|METH_KEYWORDS, - s_flush.doc() - }, - { - s_cd.name(), - (PyCFunction)PyBobIoHDF5File_changeDirectory, - METH_VARARGS|METH_KEYWORDS, - s_cd.doc(), - }, - { - s_has_group.name(), - (PyCFunction)PyBobIoHDF5File_hasGroup, - METH_VARARGS|METH_KEYWORDS, - s_has_group.doc(), - }, - { - s_create_group.name(), - (PyCFunction)PyBobIoHDF5File_createGroup, - METH_VARARGS|METH_KEYWORDS, - s_create_group.doc(), - }, - { - s_has_dataset.name(), - (PyCFunction)PyBobIoHDF5File_hasDataset, - METH_VARARGS|METH_KEYWORDS, - s_has_dataset.doc(), - }, - { - s_has_key.name(), - (PyCFunction)PyBobIoHDF5File_hasDataset, - METH_VARARGS|METH_KEYWORDS, - s_has_key.doc(), - }, - { - s_describe.name(), - (PyCFunction)PyBobIoHDF5File_describe, - METH_VARARGS|METH_KEYWORDS, - s_describe.doc(), - }, - { - s_unlink.name(), - (PyCFunction)PyBobIoHDF5File_unlink, - METH_VARARGS|METH_KEYWORDS, - s_unlink.doc(), - }, - { - s_rename.name(), - (PyCFunction)PyBobIoHDF5File_rename, - METH_VARARGS|METH_KEYWORDS, - s_rename.doc(), - }, - { - s_paths.name(), - (PyCFunction)PyBobIoHDF5File_paths, - METH_VARARGS|METH_KEYWORDS, - s_paths.doc(), - }, - { - s_keys.name(), - (PyCFunction)PyBobIoHDF5File_paths, - METH_VARARGS|METH_KEYWORDS, - s_keys.doc(), - }, - { - s_sub_groups.name(), - (PyCFunction)PyBobIoHDF5File_subGroups, - METH_VARARGS|METH_KEYWORDS, - s_sub_groups.doc(), - }, - { - s_read.name(), - (PyCFunction)PyBobIoHDF5File_read, - METH_VARARGS|METH_KEYWORDS, - s_read.doc(), - }, - { - s_get.name(), - (PyCFunction)PyBobIoHDF5File_read, - METH_VARARGS|METH_KEYWORDS, - s_get.doc(), - }, - { - s_lread.name(), - (PyCFunction)PyBobIoHDF5File_listRead, - METH_VARARGS|METH_KEYWORDS, - s_lread.doc(), - }, - { - s_replace.name(), - (PyCFunction)PyBobIoHDF5File_replace, - METH_VARARGS|METH_KEYWORDS, - s_replace.doc(), - }, - { - s_append.name(), - (PyCFunction)PyBobIoHDF5File_append, - METH_VARARGS|METH_KEYWORDS, - s_append.doc(), - }, - { - s_set.name(), - (PyCFunction)PyBobIoHDF5File_set, - METH_VARARGS|METH_KEYWORDS, - s_set.doc(), - }, - { - s_write.name(), - (PyCFunction)PyBobIoHDF5File_set, - METH_VARARGS|METH_KEYWORDS, - s_write.doc(), - }, - { - s_copy.name(), - (PyCFunction)PyBobIoHDF5File_copy, - METH_VARARGS|METH_KEYWORDS, - s_copy.doc(), - }, - { - s_get_attribute.name(), - (PyCFunction)PyBobIoHDF5File_getAttribute, - METH_VARARGS|METH_KEYWORDS, - s_get_attribute.doc(), - }, - { - s_get_attributes.name(), - (PyCFunction)PyBobIoHDF5File_getAttributes, - METH_VARARGS|METH_KEYWORDS, - s_get_attributes.doc(), - }, - { - s_set_attribute.name(), - (PyCFunction)PyBobIoHDF5File_setAttribute, - METH_VARARGS|METH_KEYWORDS, - s_set_attribute.doc(), - }, - { - s_set_attributes.name(), - (PyCFunction)PyBobIoHDF5File_setAttributes, - METH_VARARGS|METH_KEYWORDS, - s_set_attributes.doc(), - }, - { - s_del_attribute.name(), - (PyCFunction)PyBobIoHDF5File_delAttribute, - METH_VARARGS|METH_KEYWORDS, - s_del_attribute.doc(), - }, - { - s_del_attributes.name(), - (PyCFunction)PyBobIoHDF5File_delAttributes, - METH_VARARGS|METH_KEYWORDS, - s_del_attributes.doc(), - }, - { - s_has_attribute.name(), - (PyCFunction)PyBobIoHDF5File_hasAttribute, - METH_VARARGS|METH_KEYWORDS, - s_has_attribute.doc(), - }, - {0} /* Sentinel */ -}; - -static auto s_cwd = bob::extension::VariableDoc( - "cwd", - "str", - "The current working directory set on the file" -); -static PyObject* PyBobIoHDF5File_cwd(PyBobIoHDF5FileObject* self) { -BOB_TRY - return Py_BuildValue("s", self->f->cwd().c_str()); -BOB_CATCH_MEMBER(exception_message(self, s_cwd.name()).c_str(), 0) -} - -static auto s_filename = bob::extension::VariableDoc( - "filename", - "str", - "The name (and path) of the underlying file on hard disk" -); -static PyObject* PyBobIoHDF5File_filename(PyBobIoHDF5FileObject* self) { -BOB_TRY - return Py_BuildValue("s", self->f->filename().c_str()); -BOB_CATCH_MEMBER(exception_message(self, s_filename.name()).c_str(), 0) -} - - -static auto s_writable = bob::extension::VariableDoc( - "writable", - "bool", - "Has this file been opened in writable mode?" -); -static PyObject* PyBobIoHDF5File_writable(PyBobIoHDF5FileObject* self) { -BOB_TRY - return Py_BuildValue("b", self->f->writable()); -BOB_CATCH_MEMBER(exception_message(self, s_writable.name()).c_str(), 0) -} - -static PyGetSetDef PyBobIoHDF5File_getseters[] = { - { - s_cwd.name(), - (getter)PyBobIoHDF5File_cwd, - 0, - s_cwd.doc(), - 0, - }, - { - s_filename.name(), - (getter)PyBobIoHDF5File_filename, - 0, - s_filename.doc(), - 0, - }, - { - s_writable.name(), - (getter)PyBobIoHDF5File_writable, - 0, - s_writable.doc(), - 0, - }, - {0} /* Sentinel */ -}; - -PyTypeObject PyBobIoHDF5File_Type = { - PyVarObject_HEAD_INIT(0, 0) - 0 -}; - -bool init_HDF5File(PyObject* module){ - - // initialize the HDF5 file - PyBobIoHDF5File_Type.tp_name = s_hdf5file.name(); - PyBobIoHDF5File_Type.tp_basicsize = sizeof(PyBobIoHDF5FileObject); - PyBobIoHDF5File_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; - PyBobIoHDF5File_Type.tp_doc = s_hdf5file.doc(); - - // set the functions - PyBobIoHDF5File_Type.tp_new = PyBobIoHDF5File_New; - PyBobIoHDF5File_Type.tp_init = reinterpret_cast<initproc>(PyBobIoHDF5File_init); - PyBobIoHDF5File_Type.tp_dealloc = reinterpret_cast<destructor>(PyBobIoHDF5File_Delete); - PyBobIoHDF5File_Type.tp_methods = PyBobIoHDF5File_methods; - PyBobIoHDF5File_Type.tp_getset = PyBobIoHDF5File_getseters; - - PyBobIoHDF5File_Type.tp_str = reinterpret_cast<reprfunc>(PyBobIoHDF5File_repr); - PyBobIoHDF5File_Type.tp_repr = reinterpret_cast<reprfunc>(PyBobIoHDF5File_repr); - - - // check that everyting is fine - if (PyType_Ready(&PyBobIoHDF5File_Type) < 0) - return false; - - // add the type to the module - Py_INCREF(&PyBobIoHDF5File_Type); - return PyModule_AddObject(module, s_hdf5file.name(), (PyObject*)&PyBobIoHDF5File_Type) >= 0; -} diff --git a/bob/io/base/include/bob.io.base/CodecRegistry.h b/bob/io/base/include/bob.io.base/CodecRegistry.h deleted file mode 100644 index 019bb57..0000000 --- a/bob/io/base/include/bob.io.base/CodecRegistry.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @date Tue Oct 25 23:25:46 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_CODECREGISTRY_H -#define BOB_IO_BASE_CODECREGISTRY_H - -#include <map> -#include <string> -#include <boost/shared_ptr.hpp> - -#include <bob.io.base/File.h> - -namespace bob { namespace io { namespace base { - - /** - * The CodecRegistry holds registered converters for different types of - * input files. It manages registration and helps the user in picking the - * best codecs for their data. This class is a singleton (single global - * variable). - */ - class CodecRegistry { - - public: //static access - - /** - * Returns the singleton - */ - static boost::shared_ptr<CodecRegistry> instance(); - - static const std::map<std::string, std::string>& getExtensions () { - boost::shared_ptr<CodecRegistry> ptr = instance(); - return ptr->s_extension2description; - } - - /** - * Sets and unsets double-registration ignore flag - */ - static bool ignoreDoubleRegistration() { return instance()->s_ignore; } - static void ignoreDoubleRegistration(bool v) { instance()->s_ignore = v; } - - public: //object access - - void registerExtension(const char* extension, const char* description, - file_factory_t factory); - - void deregisterFactory(file_factory_t factory); - void deregisterExtension(const char* ext); - - /** - * Returns the codec description, if an extension was registered with the - * matching input string. Otherwise, returns 0. - */ - const char* getDescription(const char* ext); - - file_factory_t findByExtension(const char* ext); - file_factory_t findByFilenameExtension(const char* fn); - - bool isRegistered(const char* ext); - - private: - - CodecRegistry(): s_extension2codec(), s_ignore(false) {} - - // Not implemented - CodecRegistry( const CodecRegistry&); - - std::map<std::string, file_factory_t> s_extension2codec; - std::map<std::string, std::string> s_extension2description; - bool s_ignore; ///< shall I ignore double-registrations? - - }; - -}}} - -#endif /* BOB_IO_BASE_CODECREGISTRY_H */ diff --git a/bob/io/base/include/bob.io.base/File.h b/bob/io/base/include/bob.io.base/File.h deleted file mode 100644 index e41bccd..0000000 --- a/bob/io/base/include/bob.io.base/File.h +++ /dev/null @@ -1,184 +0,0 @@ -/** - * @date Tue Oct 25 23:25:46 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Describes a generic API for reading and writing data to external - * files. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_FILE_H -#define BOB_IO_BASE_FILE_H - -#include <boost/shared_ptr.hpp> -#include <bob.io.base/array.h> -#include <bob.io.base/blitz_array.h> - -namespace bob { namespace io { namespace base { - - /** - * @brief Files deal with reading and writing multiple (homogeneous) array - * data to and from files. - */ - class File { - - public: //abstract API - - virtual ~File(); - - /** - * The filename this array codec current points to - */ - virtual const char* filename() const =0; - - /** - * The typeinfo of data within this file, if it is supposed to be read as - * as a sequence of arrays - */ - virtual const bob::io::base::array::typeinfo& type() const =0; - - /** - * The typeinfo of data within this file, if it is supposed to be read as - * a single array. - */ - virtual const bob::io::base::array::typeinfo& type_all() const =0; - - /** - * The number of arrays available in this file, if it is supposed to be - * read as a sequence of arrays. - */ - virtual size_t size() const =0; - - /** - * Returns the name of the codec, for compatibility reasons. - */ - virtual const char* name() const =0; - - /** - * Loads the data of the array into memory. If an index is specified - * loads the specific array data from the file, otherwise, loads the data - * at position 0. - * - * This method will check to see if the given array has enough space. If - * that is not the case, it will allocate enough space internally by - * reseting the input array and putting the data read from the file - * inside. - */ - virtual void read(bob::io::base::array::interface& buffer, size_t index) =0; - - /** - * Loads all the data available at the file into a single in-memory - * array. - * - * This method will check to see if the given array has enough space. If - * that is not the case, it will allocate enough space internally by - * reseting the input array and putting the data read from the file - * inside. - */ - virtual void read_all(bob::io::base::array::interface& buffer) =0; - - /** - * Appends the given buffer into a file. If the file does not exist, - * create a new file, else, makes sure that the inserted array respects - * the previously set file structure. - * - * Returns the current position of the newly written array. - */ - virtual size_t append (const bob::io::base::array::interface& buffer) =0; - - /** - * Writes the data from the given buffer into the file and act like it is - * the only piece of data that will ever be written to such a file. Not - * more data appending may happen after a call to this method. - */ - virtual void write (const bob::io::base::array::interface& buffer) =0; - - public: //blitz::Array specific API - - /** - * This method returns a copy of the array in the file with the element - * type you wish (just have to get the number of dimensions right!). - */ - template <typename T, int N> blitz::Array<T,N> cast(size_t index) { - bob::io::base::array::blitz_array tmp(type()); - read(tmp, index); - return tmp.cast<T,N>(); - } - - /** - * This method returns a copy of the array in the file with the element - * type you wish (just have to get the number of dimensions right!). - * - * This variant loads all data available into the file in a single array. - */ - template <typename T, int N> blitz::Array<T,N> cast_all() { - bob::io::base::array::blitz_array tmp(type_all()); - read_all(tmp); - return tmp.cast<T,N>(); - } - - template <typename T, int N> void read(blitz::Array<T,N>& io, - size_t index) { - bob::io::base::array::blitz_array use_this(io); - use_this.set(type()); - read(use_this, index); - io.reference(use_this.get<T,N>()); - } - - template <typename T, int N> blitz::Array<T,N> read(size_t index) { - bob::io::base::array::blitz_array tmp(type()); - read(tmp, index); - return tmp.get<T,N>(); - } - - template <typename T, int N> void read_all(blitz::Array<T,N>& io) { - bob::io::base::array::blitz_array use_this(io); - use_this.set(type_all()); - read_all(use_this); - io.reference(use_this.get<T,N>()); - } - - template <typename T, int N> blitz::Array<T,N> read_all() { - bob::io::base::array::blitz_array tmp(type_all()); - read_all(tmp); - return tmp.get<T,N>(); - } - - template <typename T, int N> size_t append(const blitz::Array<T,N>& in) { - bob::io::base::array::blitz_array use_this(in); - return append(use_this); - } - - template <typename T, int N> void write (const blitz::Array<T,N>& in) { - bob::io::base::array::blitz_array use_this(in); - write(use_this); - } - - }; - - /** - * @brief This defines the factory method F that can create codecs. Your - * task, as a codec developer is to create one of such methods for each of - * your codecs and statically register them to the codec registry. - * - * Here are the meanings of the mode flag that should be respected by your - * factory implementation: - * - * 'r': opens for reading only - no modifications can occur; it is an - * error to open a file that does not exist for read-only operations. - * 'w': opens for reading and writing, but truncates the file if it - * exists; it is not an error to open files that do not exist with - * this flag. - * 'a': opens for reading and writing - any type of modification can - * occur. If the file does not exist, this flag is effectively like - * 'w'. - * - * Returns a newly allocated File object that can read and write data to the - * file using a specific backend. - */ - typedef boost::shared_ptr<File> (*file_factory_t) (const char* filename, char mode); - -}}} - -#endif /* BOB_IO_BASE_FILE_H */ diff --git a/bob/io/base/include/bob.io.base/HDF5Attribute.h b/bob/io/base/include/bob.io.base/HDF5Attribute.h deleted file mode 100644 index 3af8a7a..0000000 --- a/bob/io/base/include/bob.io.base/HDF5Attribute.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Fri 2 Mar 08:19:03 2012 - * - * @brief Simple attribute support for HDF5 files - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_HDF5ATTRIBUTE_H -#define BOB_IO_BASE_HDF5ATTRIBUTE_H - -#include <string> -#include <map> -#include <boost/shared_ptr.hpp> -#include <hdf5.h> - -#include <bob.io.base/HDF5Types.h> - -namespace bob { namespace io { namespace base { namespace detail { namespace hdf5 { - - /** - * Finds out the type of the attribute, if it exists, raises otherwise. - */ - void gettype_attribute (const boost::shared_ptr<hid_t> location, - const std::string& name, HDF5Type& type); - - /** - * Reads the attribute value, place it in "buffer" - */ - void read_attribute (const boost::shared_ptr<hid_t> location, - const std::string& name, const bob::io::base::HDF5Type& dest, void* buffer); - - /** - * Writes an attribute value from "buffer" - */ - void write_attribute (boost::shared_ptr<hid_t> location, - const std::string& name, const bob::io::base::HDF5Type& dest, - const void* buffer); - - /** - * Sets a scalar attribute on the given location. Setting an existing - * attribute overwrites its value. - * - * @note Only simple scalars are supported for the time being - */ - template <typename T> void set_attribute(boost::shared_ptr<hid_t> location, - const std::string& name, const T& v) { - bob::io::base::HDF5Type dest_type(v); - write_attribute(location, name, dest_type, - reinterpret_cast<const void*>(&v)); - } - - /** - * Reads an attribute from the current group. Raises an error if such - * attribute does not exist on the group. To check for existence, use - * has_attribute(). - */ - template <typename T> T get_attribute(const boost::shared_ptr<hid_t> location, - const std::string& name) { - T v; - bob::io::base::HDF5Type dest_type(v); - read_attribute(location, name, dest_type, reinterpret_cast<void*>(&v)); - return v; - } - - /** - * Checks if a certain attribute exists in this location. - */ - bool has_attribute(const boost::shared_ptr<hid_t> location, - const std::string& name); - - /** - * Deletes an attribute from a location. - */ - void delete_attribute(boost::shared_ptr<hid_t> location, - const std::string& name); - - /** - * Lists all attributes and associated types currently available somewhere - */ - void list_attributes(boost::shared_ptr<hid_t> location, - std::map<std::string, bob::io::base::HDF5Type>& attributes); - -}}}}} - -#endif /* BOB_IO_BASE_HDF5ATTRIBUTE_H */ diff --git a/bob/io/base/include/bob.io.base/HDF5Dataset.h b/bob/io/base/include/bob.io.base/HDF5Dataset.h deleted file mode 100644 index 5572410..0000000 --- a/bob/io/base/include/bob.io.base/HDF5Dataset.h +++ /dev/null @@ -1,536 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 29 Feb 17:27:45 2012 - * - * @brief Describes HDF5 datasets - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_HDF5DATASET_H -#define BOB_IO_BASE_HDF5DATASET_H - -#include <vector> - -#include <boost/shared_ptr.hpp> -#include <blitz/array.h> -#include <hdf5.h> - -#include <bob.core/assert.h> -#include <bob.core/array_copy.h> - -#include <bob.io.base/HDF5Attribute.h> -#include <bob.io.base/HDF5Types.h> - -namespace bob { namespace io { namespace base { namespace detail { namespace hdf5 { - - class File; - class Group; - - /** - * An HDF5 C-style dataset that knows how to close itself. - */ - class Dataset { - - public: //better to protect? - - /** - * Creates a new HDF5 dataset by reading its contents from a certain - * file. - */ - Dataset(boost::shared_ptr<Group> parent, const std::string& name); - - /** - * Creates a new HDF5 dataset from scratch and inserts it in the given - * group. If the Dataset already exists on file and the types are - * compatible, we attach to that type, otherwise, we raise an exception. - * - * If a new Dataset is to be created, you can also set if you would like - * to have as a list and the compression level. Note these settings have - * no effect if the Dataset already exists on file, in which case the - * current settings for that dataset are respected. The maximum value for - * the gzip compression is 9. The value of zero turns compression off - * (the default). - * - * The effect of setting "list" to false is that the created dataset: - * - * a) Will not be expandable (chunked) - * b) Will contain the exact number of dimensions of the input type. - * - * When you set "list" to true (the default), datasets are created with - * chunking automatically enabled (the chunk size is set to the size of - * the given variable) and an extra dimension is inserted to accommodate - * list operations. - */ - Dataset(boost::shared_ptr<Group> parent, const std::string& name, - const bob::io::base::HDF5Type& type, bool list=true, - size_t compression=0); - - public: //api - - /** - * Destructor virtualization - */ - virtual ~Dataset(); - - /** - * Returns the number of objects installed at this dataset from the - * perspective of the default compatible type. - */ - size_t size() const; - - /** - * Returns the number of objects installed at this dataset from the - * perspective of the default compatible type. If the given type is not - * compatible, raises a type error. - */ - size_t size(const bob::io::base::HDF5Type& type) const; - - /** - * Get parent group - */ - virtual const boost::shared_ptr<Group> parent() const; - virtual boost::shared_ptr<Group> parent(); - - /** - * Filename where I'm sitting - */ - virtual const std::string& filename() const; - - /** - * Full path to myself. Constructed each time it is called. - */ - virtual std::string path() const; - - /** - * Path with filename. Constructed each time it is called. - */ - virtual std::string url() const; - - /** - * Access file - */ - virtual const boost::shared_ptr<File> file() const; - virtual boost::shared_ptr<File> file(); - - /** - * My name - */ - virtual const std::string& name() const { - return m_name; - } - - /** - * Accesses the current location id of this dataset - */ - const boost::shared_ptr<hid_t> location() const { - return m_id; - } - boost::shared_ptr<hid_t> location() { - return m_id; - } - - /** - * DATA READING FUNCTIONALITY - */ - - /** - * Reads data from the file into a scalar. The conditions bellow have to - * be respected: - * - * a. My internal shape is 1D **OR** my internal shape is 2D, but the - * extent of the second dimension is 1. - * b. The indexed position exists - * - * If the internal shape is not like defined above, raises a type error. - * If the indexed position does not exist, raises an index error. - */ - template <typename T> void read(size_t index, T& value) { - bob::io::base::HDF5Type dest_type(value); - read_buffer(index, dest_type, reinterpret_cast<void*>(&value)); - } - - /** - * Reads data from the file into a scalar (allocated internally). The - * same conditions as for read(index, value) apply. - */ - template <typename T> T read(size_t index) { - T retval; - read(index, retval); - return retval; - } - - /** - * Reads data from the file into a scalar. This is equivalent to using - * read(0). The same conditions as for read(index=0, value) apply. - */ - template <typename T> T read() { - T retval; - read(0, retval); - return retval; - } - - /** - * Reads data from the file into a array. The following conditions have - * to be respected: - * - * a. My internal shape is the same as the shape of the given value - * **OR** my internal shape has one more dimension as the given value. - * In this case, the first dimension of the internal shape is - * considered to be an index and the remaining shape values the - * dimension of the value to be read. The given array has to be - * compatible with this re-defined N-1 shape. - * b. The indexed position exists - * - * If the internal shape is not like defined above, raises a type error. - * If the index does not exist, raises an index error. - * - * @param index Which of the arrays to read in the current dataset, by - * order - * @param value The output array data will be stored inside this - * variable. This variable has to be a zero-based C-style contiguous - * storage array. If that is not the case, we will raise an exception. - */ - template <typename T, int N> - void readArray(size_t index, blitz::Array<T,N>& value) { - bob::core::array::assertCZeroBaseContiguous(value); - bob::io::base::HDF5Type dest_type(value); - read_buffer(index, dest_type, reinterpret_cast<void*>(value.data())); - } - - /** - * Reads data from the file into an array allocated dynamically. The same - * conditions as for readArray(index, value) apply. - * - * @param index Which of the arrays to read in the current dataset, by - * order - */ - template <typename T, int N> - blitz::Array<T,N> readArray(size_t index) { - for (size_t k=m_descr.size(); k>0; --k) { - const bob::io::base::HDF5Shape& S = m_descr[k-1].type.shape(); - if(S.n() == N) { - blitz::TinyVector<int,N> shape; - S.set(shape); - blitz::Array<T,N> retval(shape); - readArray(index, retval); - return retval; - } - } - boost::format m("trying to read or write `%s' at `%s' that only accepts `%s'"); - m % "unknown dynamic shape" % url() % m_descr[0].type.str(); - throw std::runtime_error(m.str()); - } - - /** - * Reads data from the file into a array. This is equivalent to using - * readArray(0, value). The same conditions as for readArray(index=0, - * value) apply. - * - * @param value The output array data will be stored inside this - * variable. This variable has to be a zero-based C-style contiguous - * storage array. If that is not the case, we will raise an exception. - */ - template <typename T, int N> - void readArray(blitz::Array<T,N>& value) { - readArray(0, value); - } - - /** - * Reads data from the file into a array. This is equivalent to using - * readArray(0). The same conditions as for readArray(index=0, value) - * apply. - */ - template <typename T, int N> - blitz::Array<T,N> readArray() { - return readArray<T,N>(0); - } - - /** - * DATA WRITING FUNCTIONALITY - */ - - /** - * Modifies the value of a scalar inside the file. Modifying a value - * requires that the expected internal shape for this dataset and the - * shape of the given scalar are consistent. To replace a scalar the - * conditions bellow have to be respected: - * - * a. The internal shape is 1D **OR** the internal shape is 2D, but the - * second dimension of the internal shape has is extent == 1. - * b. The given indexing position exists - * - * If the above conditions are not met, an exception is raised. - */ - template <typename T> void replace(size_t index, const T& value) { - bob::io::base::HDF5Type dest_type(value); - write_buffer(index, dest_type, reinterpret_cast<const void*>(&value)); - } - - /** - * Modifies the value of a scalar inside the file. This is equivalent to - * using replace(0, value). The same conditions as for replace(index=0, - * value) apply. - */ - template <typename T> void replace(const T& value) { - replace(0, value); - } - - /** - * Inserts a scalar in the current (existing ;-) dataset. This will - * trigger writing data to the file. Adding a scalar value requires that - * the expected internal shape for this dataset and the shape of the - * given scalar are consistent. To add a scalar the conditions - * bellow have to be respected: - * - * a. The internal shape is 1D **OR** the internal shape is 2D, but the - * second dimension of the internal shape has is extent == 1. - * b. This dataset is expandible (chunked) - * - * If the above conditions are not met, an exception is raised. - */ - template <typename T> void add(const T& value) { - bob::io::base::HDF5Type dest_type(value); - extend_buffer(dest_type, reinterpret_cast<const void*>(&value)); - } - - /** - * Replaces data at the file using a new array. Replacing an existing - * array requires shape consistence. The following conditions should be - * met: - * - * a. My internal shape is the same as the shape of the given value - * **OR** my internal shape has one more dimension as the given value. - * In this case, the first dimension of the internal shape is - * considered to be an index and the remaining shape values the - * dimension of the value to be read. The given array has to be - * compatible with this re-defined N-1 shape. - * b. The given indexing position exists. - * - * If the internal shape is not like defined above, raises a type error. - * If the indexed position does not exist, raises an index error. - * - * @param index Which of the arrays to read in the current dataset, by - * order - * @param value The output array data will be stored inside this - * variable. This variable has to be a zero-based C-style contiguous - * storage array. If that is not the case, we will raise an exception. - */ - template <typename T, int N> - void replaceArray(size_t index, const blitz::Array<T,N>& value) { - bob::io::base::HDF5Type dest_type(value); - if(!bob::core::array::isCZeroBaseContiguous(value)) { - blitz::Array<T,N> tmp = bob::core::array::ccopy(value); - write_buffer(index, dest_type, reinterpret_cast<const void*>(tmp.data())); - } - else { - write_buffer(index, dest_type, - reinterpret_cast<const void*>(value.data())); - } - } - - /** - * Replaces data at the file using a new array. This is equivalent to - * calling replaceArray(0, value). The conditions for - * replaceArray(index=0, value) apply. - * - * @param value The output array data will be stored inside this - * variable. This variable has to be a zero-based C-style contiguous - * storage array. If that is not the case, we will raise an exception. - */ - template <typename T, int N> - void replaceArray(const blitz::Array<T,N>& value) { - replaceArray(0, value); - } - - /** - * Appends a array in a certain subdirectory of the file. If that - * subdirectory (or a "group" in HDF5 parlance) does not exist, it is - * created. If the dataset does not exist, it is created, otherwise, we - * append to it. In this case, the dimensionality of the scalar has to be - * compatible with the existing dataset shape (or "dataspace" in HDF5 - * parlance). If you want to do this, first unlink and than use one of - * the add() methods. - */ - template <typename T, int N> - void addArray(const blitz::Array<T,N>& value) { - bob::io::base::HDF5Type dest_type(value); - if(!bob::core::array::isCZeroBaseContiguous(value)) { - blitz::Array<T,N> tmp = bob::core::array::ccopy(value); - extend_buffer(dest_type, reinterpret_cast<const void*>(tmp.data())); - } - else { - extend_buffer(dest_type, reinterpret_cast<const void*>(value.data())); - } - } - - private: //apis - - /** - * Selects a bit of the file to be affected at the next read or write - * operation. This method encapsulate calls to H5Sselect_hyperslab(). - * - * The index is checked for existence as well as the consistence of the - * destination type. - */ - std::vector<bob::io::base::HDF5Descriptor>::iterator select (size_t index, - const bob::io::base::HDF5Type& dest); - - public: //direct access for other bindings -- don't use these! - - /** - * Reads a previously selected area into the given (user) buffer. - */ - void read_buffer (size_t index, const bob::io::base::HDF5Type& dest, void* buffer); - - /** - * Writes the contents of a given buffer into the file. The area that the - * data will occupy should have been selected beforehand. - */ - void write_buffer (size_t index, const bob::io::base::HDF5Type& dest, - const void* buffer); - - /** - * Extend the dataset with one extra variable. - */ - void extend_buffer (const bob::io::base::HDF5Type& dest, const void* buffer); - - public: //attribute support - - /** - * Gets the current type set for an attribute - */ - void gettype_attribute(const std::string& name, - HDF5Type& type) const; - - /** - * Sets a scalar attribute on the current group. Setting an existing - * attribute overwrites its value. - */ - template <typename T> void set_attribute(const std::string& name, - const T& v) { - bob::io::base::HDF5Type dest_type(v); - write_attribute(name, dest_type, reinterpret_cast<const void*>(&v)); - } - - /** - * Reads an attribute from the current dataset. Raises an error if such - * attribute does not exist on the group. To check for existence, use - * has_attribute(). - */ - template <typename T> T get_attribute(const std::string& name) const { - T v; - bob::io::base::HDF5Type dest_type(v); - read_attribute(name, dest_type, reinterpret_cast<void*>(&v)); - return v; - } - - /** - * Checks if a certain attribute exists in this group. - */ - bool has_attribute(const std::string& name) const; - - /** - * Deletes an attribute - */ - void delete_attribute(const std::string& name); - - /** - * List attributes available on this dataset. - */ - void list_attributes(std::map<std::string, bob::io::base::HDF5Type>& attributes) const; - - public: //array attribute support - - /** - * Sets a array attribute on the current group. Setting an existing - * attribute overwrites its value. If the attribute exists it is erased - * and re-written. - */ - template <typename T, int N> void set_array_attribute(const std::string& name, - const blitz::Array<T,N>& v) { - bob::io::base::HDF5Type dest_type(v); - if(!bob::core::array::isCZeroBaseContiguous(v)) { - blitz::Array<T,N> tmp = bob::core::array::ccopy(v); - write_attribute(name, dest_type, reinterpret_cast<const void*>(tmp.data())); - } - else { - write_attribute(name, dest_type, reinterpret_cast<const void*>(v.data())); - } - } - - /** - * Reads an attribute from the current dataset. Raises an error if such - * attribute does not exist on the group. To check for existence, use - * has_attribute(). - */ - template <typename T, int N> blitz::Array<T,N> get_array_attribute(const std::string& name) const { - blitz::Array<T,N> v; - bob::io::base::HDF5Type dest_type(v); - read_attribute(name, dest_type, reinterpret_cast<void*>(v.data())); - return v; - } - - /** - * Reads an attribute from the current dataset. Places the data in an - * already allocated array. - */ - template <typename T, int N> void get_array_attribute(const std::string& name, - blitz::Array<T,N>& v) const { - bob::io::base::HDF5Type dest_type(v); - read_attribute(name, dest_type, reinterpret_cast<void*>(v.data())); - } - - public: //buffer attribute support - - /** - * Reads an attribute into a user buffer. It is the user's responsibility - * to have a buffer that represents the given type. - */ - void read_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest, void* buffer) const; - - /** - * Writes the contents of a given buffer into the attribute. - */ - void write_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest, const void* buffer); - - private: //not implemented - - /** - * Copies the contents of an existing dataset -- not implemented - */ - Dataset(const Dataset& other); - - /** - * Assigns the contents of an existing dataset to myself -- not - * implemented - */ - Dataset& operator= (const Dataset& other); - - public: //representation - - boost::weak_ptr<Group> m_parent; ///< my parent group - std::string m_name; ///< name of this object - boost::shared_ptr<hid_t> m_id; ///< the HDF5 Dataset this type points to - boost::shared_ptr<hid_t> m_dt; ///< the datatype of this Dataset - boost::shared_ptr<hid_t> m_filespace; ///< the "file" space for this set - std::vector<bob::io::base::HDF5Descriptor> m_descr; ///< read/write descr.'s - boost::shared_ptr<hid_t> m_memspace; ///< read/write space - - }; - - /** - * std::string specialization - */ - template <> void Dataset::read<std::string>(size_t index, std::string& value); - template <> void Dataset::replace<std::string>(size_t index, const std::string& value); - template <> void Dataset::add<std::string>(const std::string& value); - template <> void Dataset::set_attribute<std::string>(const std::string& name, const std::string& v); - template <> std::string Dataset::get_attribute(const std::string& name) const; - -}}}}} - - -#endif /* BOB_IO_BASE_HDF5DATASET_H */ diff --git a/bob/io/base/include/bob.io.base/HDF5File.h b/bob/io/base/include/bob.io.base/HDF5File.h deleted file mode 100644 index 31c6594..0000000 --- a/bob/io/base/include/bob.io.base/HDF5File.h +++ /dev/null @@ -1,558 +0,0 @@ -/** - * @date Wed Jun 22 17:50:08 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief bob support for HDF5 files. HDF5 is a open standard for - * self-describing data files. You can get more information in this webpage: - * http://www.hdfgroup.org/HDF5 - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_HDF5FILE_H -#define BOB_IO_BASE_HDF5FILE_H - -#include <boost/format.hpp> - -#include <bob.io.base/HDF5Utils.h> - -namespace bob { namespace io { namespace base { - - /** - * This is the main type for interfacing bob with HDF5. It allows the user - * to create, delete and modify data objects using a very-level API. The - * total functionality provided by this API is, of course, much smaller than - * what is provided if you use the HDF5 C-APIs directly, but is much simpler - * as well. - */ - class HDF5File { - - public: - - /** - * This enumeration defines the different values with which you can open - * the files with - */ - typedef enum mode_t { - in = 0, //H5F_ACC_RDONLY < can only read file - inout = 1, //H5F_ACC_RDWR < open file for reading and writing - trunc = 2, //H5F_ACC_TRUNC < if file exists, truncate it and open - excl = 4 //H5F_ACC_EXCL < if file exists, raise, otherwise == inout - } mode_t; - - public: //api - - /** - * Constructor, starts a new HDF5File object giving it a file name and an - * action: excl/trunc/in/inout - */ - HDF5File (const std::string& filename, mode_t mode); - - /** - * Constructor, starts a new HDF5File object giving it a file name and an - * action: 'r' (read-only), 'a' (read/write/append), 'w' (read/write/truncate) or 'x' (read/write/exclusive) - */ - HDF5File (const std::string& filename, const char mode='r'); - - /** - * Destructor virtualization - */ - virtual ~HDF5File(); - - /** - * Flushes the current content of the file to disk. - */ - void flush() {m_file->flush();} - - /** - * Closes the file after writing its content to disk - */ - void close(); - - /** - * Changes the current prefix path. When this object is started, it - * points to the root of the file. If you set this to a different - * value, it will be used as a prefix to any subsequent operation on - * relative paths until you reset it. - * - * @param path If path starts with '/', it is treated as an absolute - * path. '..' and '.' are supported. This object should be a std::string. - * If the value is relative, it is added to the current path. - * - * @note All operations taking a relative path, following a cd(), will be - * considered relative to the value returned by cwd(). - */ - void cd(const std::string& path); - - /** - * Tells if a certain directory exists in a file. - */ - bool hasGroup(const std::string& path); - - /** - * Creates a directory within the file. It is an error to recreate a path - * that already exists. You can check this with hasGroup() - */ - void createGroup(const std::string& path); - - /** - * Returns the name of the file currently opened - */ - const std::string filename() const {check_open(); return m_file->filename(); } - - /** - * Checks if the file is open for writing - */ - bool writable() const {check_open(); return m_file->writable();} - - /** - * Returns the current working path, fully resolved. This is - * re-calculated every time you call this method. - */ - std::string cwd() const; - - /** - * Tells if we have a variable with the given name inside the HDF5 file. - * If the file path given is a relative file path, it is taken w.r.t. the - * current working directory, as returned by cwd(). - */ - bool contains(const std::string& path) const; - - /** - * Describe a certain dataset path. If the file path is a relative one, - * it is taken w.r.t. the current working directory, as returned by - * cwd(). - */ - const std::vector<HDF5Descriptor>& describe (const std::string& path) const; - - /** - * Unlinks a particular dataset from the file. Note that this will - * not erase the data on the current file as that functionality is not - * provided by HDF5. To actually reclaim the space occupied by the - * unlinked structure, you must re-save this file to another file. The - * new file will not contain the data of any dangling datasets (datasets - * w/o names or links). Relative paths are allowed. - */ - void unlink (const std::string& path); - - /** - * Renames an existing dataset - */ - void rename (const std::string& from, const std::string& to); - - /** - * Accesses all existing paths in one shot. Input has to be a std - * container with T = std::string and accepting push_back() - */ - template <typename T> void paths (T& container, const bool relative = false) const { - m_cwd->dataset_paths(container); - check_open(); - if (relative){ - const std::string d = cwd(); - const int len = d.length()+1; - for (typename T::iterator it = container.begin(); it != container.end(); ++it){ - // assert that the string contains the current path - assert(it->find(d) == 0); - // subtract current path - *it = it->substr(len); - } - } - } - - /** - * Accesses all existing paths in one shot. Input has to be a std - * container with T = std::string and accepting push_back() - */ - template <typename T> void sub_groups (T& container, bool relative = false, bool recursive = true) const { - check_open(); - m_cwd->subgroup_paths(container, recursive); - if (!relative){ - const std::string d = cwd() + "/"; - for (typename T::iterator it = container.begin(); it != container.end(); ++it){ - // add current path - *it = d + *it; - } - } - } - - /** - * Copies the contents of the other file to this file. This is a blind - * operation, so we try to copy everything from the given file to the - * current one. It is the user responsibility to make sure the "path" - * slots in the other file are not already taken. If that is detected, an - * exception will be raised. - * - * This operation will be conducted w.r.t. the currently set prefix path - * (verifiable using cwd()). - */ - void copy (HDF5File& other); - - /** - * Reads data from the file into a scalar. Raises an exception if the - * type is incompatible. Relative paths are accepted. - */ - template <typename T> - void read(const std::string& path, size_t pos, T& value) { - check_open(); - (*m_cwd)[path]->read(pos, value); - } - - /** - * Reads data from the file into a scalar. Returns by copy. Raises if the - * type T is incompatible. Relative paths are accepted. - */ - template <typename T> T read(const std::string& path, size_t pos) { - check_open(); - return (*m_cwd)[path]->read<T>(pos); - } - - /** - * Reads data from the file into a scalar. Raises an exception if the - * type is incompatible. Relative paths are accepted. Calling this method - * is equivalent to calling read(path, 0). Returns by copy. - */ - template <typename T> T read(const std::string& path) { - return read<T>(path, 0); - } - - /** - * Reads data from the file into a array. Raises an exception if the type - * is incompatible. Relative paths are accepted. - */ - template <typename T, int N> void readArray(const std::string& path, - size_t pos, blitz::Array<T,N>& value) { - check_open(); - (*m_cwd)[path]->readArray(pos, value); - } - - /** - * Reads data from the file into a array. Raises an exception if the type - * is incompatible. Relative paths are accepted. Destination array is - * allocated internally and returned by value. - */ - template <typename T, int N> blitz::Array<T,N> readArray - (const std::string& path, size_t pos) { - check_open(); - return (*m_cwd)[path]->readArray<T,N>(pos); - } - - /** - * Reads data from the file into a array. Raises an exception if the type - * is incompatible. Relative paths are accepted. Calling this method is - * equivalent to calling readArray(path, 0, value). - */ - template <typename T, int N> void readArray(const std::string& path, - blitz::Array<T,N>& value) { - readArray(path, 0, value); - } - - /** - * Reads data from the file into a array. Raises an exception if the type - * is incompatible. Relative paths are accepted. Calling this method is - * equivalent to calling readArray(path, 0). Destination array is - * allocated internally. - */ - template <typename T, int N> blitz::Array<T,N> readArray - (const std::string& path) { - return readArray<T,N>(path, 0); - } - - /** - * Modifies the value of a scalar inside the file. Relative paths are - * accepted. - */ - template <typename T> void replace(const std::string& path, size_t pos, - const T& value) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot replace value at dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - (*m_cwd)[path]->replace(pos, value); - } - - /** - * Modifies the value of a scalar inside the file. Relative paths are - * accepted. Calling this method is equivalent to calling replace(path, - * 0, value). - */ - template <typename T> void replace(const std::string& path, - const T& value) { - replace(path, 0, value); - } - - /** - * Modifies the value of a array inside the file. Relative paths are - * accepted. - */ - template <typename T> void replaceArray(const std::string& path, - size_t pos, const T& value) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot replace array at dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - (*m_cwd)[path]->replaceArray(pos, value); - } - - /** - * Modifies the value of a array inside the file. Relative paths are - * accepted. Calling this method is equivalent to calling - * replaceArray(path, 0, value). - */ - template <typename T> void replaceArray(const std::string& path, - const T& value) { - replaceArray(path, 0, value); - } - - /** - * Appends a scalar in a dataset. If the dataset does not yet exist, one - * is created with the type characteristics. Relative paths are accepted. - */ - template <typename T> void append(const std::string& path, - const T& value) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot append value to dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - if (!contains(path)) m_cwd->create_dataset(path, bob::io::base::HDF5Type(value), true, 0); - (*m_cwd)[path]->add(value); - } - - /** - * Appends a array in a dataset. If the dataset does not yet exist, one - * is created with the type characteristics. Relative paths are accepted. - * - * If a new Dataset is to be created, you can also set the compression - * level. Note this setting has no effect if the Dataset already exists - * on file, in which case the current setting for that dataset is - * respected. The maximum value for the gzip compression is 9. The value - * of zero turns compression off (the default). - */ - template <typename T> void appendArray(const std::string& path, - const T& value, size_t compression=0) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot append array to dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - if (!contains(path)) m_cwd->create_dataset(path, bob::io::base::HDF5Type(value), true, compression); - (*m_cwd)[path]->addArray(value); - } - - /** - * Sets the scalar at position 0 to the given value. This method is - * equivalent to checking if the scalar at position 0 exists and then - * replacing it. If the path does not exist, we append the new scalar. - */ - template <typename T> void set(const std::string& path, const T& value) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot set value at dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - if (!contains(path)) m_cwd->create_dataset(path, bob::io::base::HDF5Type(value), false, 0); - (*m_cwd)[path]->replace(0, value); - } - - /** - * Sets the array at position 0 to the given value. This method is - * equivalent to checking if the array at position 0 exists and then - * replacing it. If the path does not exist, we append the new array. - * - * If a new Dataset is to be created, you can also set the compression - * level. Note this setting has no effect if the Dataset already exists - * on file, in which case the current setting for that dataset is - * respected. The maximum value for the gzip compression is 9. The value - * of zero turns compression off (the default). - */ - template <typename T> void setArray(const std::string& path, - const T& value, size_t compression=0) { - check_open(); - if (!m_file->writable()) { - boost::format m("cannot set array at dataset '%s' at path '%s' of file '%s' because it is not writeable"); - m % path % m_cwd->path() % m_file->filename(); - throw std::runtime_error(m.str()); - } - if (!contains(path)) m_cwd->create_dataset(path, bob::io::base::HDF5Type(value), false, compression); - (*m_cwd)[path]->replaceArray(0, value); - } - - public: //api shortcuts to deal with buffers -- avoid these at all costs! - - /** - * creates a new dataset. If the dataset already exists, checks if the - * existing data is compatible with the required type. - */ - void create (const std::string& path, const HDF5Type& dest, bool list, - size_t compression); - - /** - * Reads data from the file into a buffer. The given buffer contains - * sufficient space to hold the type described in "dest". Raises an - * exception if the type is incompatible with the expected data in the - * file. Relative paths are accepted. - */ - void read_buffer (const std::string& path, size_t pos, - const HDF5Type& type, void* buffer) const; - - /** - * writes the contents of a given buffer into the file. the area that the - * data will occupy should have been selected beforehand. - */ - void write_buffer (const std::string& path, size_t pos, - const HDF5Type& type, const void* buffer); - - /** - * extend the dataset with one extra variable. - */ - void extend_buffer (const std::string& path, - const HDF5Type& type, const void* buffer); - - /** - * Copy construct an already opened HDF5File; just creates a shallow copy - * of the file - */ - HDF5File (const HDF5File& other); - - /** - * Drop the current settings and load new ones from the other file. - */ - HDF5File& operator= (const HDF5File& other); - - public: // attribute handling - - /** - * Tells if there is an attribute with a given name on the given path, - * relative to the current location, possibly. - */ - bool hasAttribute(const std::string& path, const std::string& name) const; - - /** - * Reads data from an attribute into a scalar. If the attribute does not - * exist, raise an exception. Raises a TypeError if the types are not - * compatible. - */ - template <typename T> - void getAttribute(const std::string& path, const std::string& name, - T& value) const { - check_open(); - if (m_cwd->has_dataset(path)) { - value = (*m_cwd)[path]->get_attribute<T>(name); - } - else if (m_cwd->has_group(path)) { - value = m_cwd->cd(path)->get_attribute<T>(name); - } - else { - boost::format m("cannot read attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } - } - - /** - * Reads data from an attribute into an array. If the attribute does not - * exist, raise an exception. Raises a type error if the types are not - * compatible. - */ - template <typename T, int N> - void getArrayAttribute(const std::string& path, - const std::string& name, blitz::Array<T,N>& value) const { - check_open(); - if (m_cwd->has_dataset(path)) { - value = (*m_cwd)[path]->get_array_attribute<T,N>(name); - } - else if (m_cwd->has_group(path)) { - value = m_cwd->cd(path)->get_array_attribute<T,N>(name); - } - else { - boost::format m("cannot read (array) attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } - } - - /** - * Writes a scalar as an attribute to a path in this file. - */ - template <typename T> - void setAttribute(const std::string& path, const std::string& name, - const T value) { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->set_attribute(name, value); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->set_attribute(name, value); - } - else { - boost::format m("cannot write attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } - } - - /** - * Writes an array as an attribute to a path in this file. - */ - template <typename T, int N> - void setArrayAttribute(const std::string& path, - const std::string& name, const blitz::Array<T,N>& value) { - check_open(); - if (m_cwd->has_dataset(path)) { - (*m_cwd)[path]->set_array_attribute(name, value); - } - else if (m_cwd->has_group(path)) { - m_cwd->cd(path)->set_array_attribute(name, value); - } - else { - boost::format m("cannot write (array) attribute '%s' at path/dataset '%s' of file '%s' (cwd: '%s') because this path/dataset does not currently exist"); - m % name % path % m_file->filename() % m_cwd->path(); - throw std::runtime_error(m.str()); - } - } - - /** - * Gets the type information of an attribute - */ - void getAttributeType(const std::string& path, - const std::string& name, bob::io::base::HDF5Type& type) const; - - /** - * Deletes a given attribute - */ - void deleteAttribute(const std::string& path, - const std::string& name); - - /** - * List attributes available on a certain object. - */ - void listAttributes(const std::string& path, - std::map<std::string, bob::io::base::HDF5Type>& attributes) const; - - public: //raw accessors to attributes - - void read_attribute(const std::string& path, const std::string& name, - const bob::io::base::HDF5Type& type, void* buffer) const; - - void write_attribute(const std::string& path, const std::string& name, - const bob::io::base::HDF5Type& type, const void* buffer); - - private: //representation - - void check_open() const; - - boost::shared_ptr<detail::hdf5::File> m_file; ///< the file itself - boost::shared_ptr<detail::hdf5::Group> m_cwd; ///< current working dir - - }; - -}}} - -#endif /* BOB_IO_BASE_HDF5FILE_H */ diff --git a/bob/io/base/include/bob.io.base/HDF5Group.h b/bob/io/base/include/bob.io.base/HDF5Group.h deleted file mode 100644 index 9dcd7a6..0000000 --- a/bob/io/base/include/bob.io.base/HDF5Group.h +++ /dev/null @@ -1,468 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 29 Feb 17:24:10 2012 - * - * @brief Describes HDF5 groups. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_HDF5GROUP_H -#define BOB_IO_BASE_HDF5GROUP_H - -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <hdf5.h> - -#include <bob.io.base/HDF5Types.h> -#include <bob.io.base/HDF5Dataset.h> -#include <bob.io.base/HDF5Attribute.h> - -namespace bob { namespace io { namespace base { namespace detail { namespace hdf5 { - - class File; - - /** - * A group represents a path inside the HDF5 file. It can contain Datasets or - * other Groups. - */ - class Group: public boost::enable_shared_from_this<Group> { - - public: //better to protect? - - /** - * Creates a new group in a given parent. - */ - Group(boost::shared_ptr<Group> parent, const std::string& name); - - /** - * Binds to an existing group in a parent, reads all the group contents - * recursively. Note that the last parameter is there only to - * differentiate from the above constructor. It is ignored. - */ - Group(boost::shared_ptr<Group> parent, const std::string& name, - bool open); - - /** - * Constructor used by the root group, just open the root group - */ - Group(boost::shared_ptr<File> parent); - - /** - * Recursively open sub-groups and datasets. This cannot be done at the - * constructor because of a enable_shared_from_this<> restriction that - * results in a bad weak pointer exception being raised. - */ - void open_recursively(); - - public: //api - - /** - * D'tor - presently, does nothing - */ - virtual ~Group(); - - /** - * Get parent group - */ - virtual const boost::shared_ptr<Group> parent() const; - virtual boost::shared_ptr<Group> parent(); - - /** - * Filename where I'm sitting - */ - virtual const std::string& filename() const; - - /** - * Full path to myself. Constructed each time it is called. - */ - virtual std::string path() const; - - /** - * Access file - */ - virtual const boost::shared_ptr<File> file() const; - virtual boost::shared_ptr<File> file(); - - /** - * My name - */ - virtual const std::string& name() const { - return m_name; - } - - /** - * Deletes all children nodes and properties in this group. - * - * Note that removing data already written in a file will only be - * effective in terms of space saving when you actually re-write that - * file. This instruction just unlinks all data from this group and makes - * them inaccessible to any further read operation. - */ - virtual void reset(); - - /** - * Accesses the current location id of this group - */ - const boost::shared_ptr<hid_t> location() const { - return m_id; - } - - boost::shared_ptr<hid_t> location() { - return m_id; - } - - /** - * Path with filename. Constructed each time it is called. - */ - virtual std::string url() const; - - /** - * move up-down on the group hierarchy - */ - virtual boost::shared_ptr<Group> cd(const std::string& path); - virtual const boost::shared_ptr<Group> cd(const std::string& path) const; - - /** - * Get a mapping of all child groups - */ - virtual const std::map<std::string, boost::shared_ptr<Group> >& groups() - const { - return m_groups; - } - - /** - * Create a new subgroup with a given name. - */ - virtual boost::shared_ptr<Group> create_group(const std::string& name); - - /** - * Deletes an existing subgroup with a given name. If a relative name is - * given, it is interpreted w.r.t. to this group. - * - * Note that removing data already written in a file will only be - * effective in terms of space saving when you actually re-write that - * file. This instruction just unlinks all data from this group and makes - * them inaccessible to any further read operation. - */ - virtual void remove_group(const std::string& path); - - /** - * Rename an existing group under me. - */ - virtual void rename_group(const std::string& from, const std::string& to); - - /** - * Copies all data from an existing group into myself, creating a new - * subgroup, by default, with the same name as the other group. If a - * relative name is given, it is interpreted w.r.t. to this group. - * - * If an empty string is given as "dir", copies the other group name. - */ - virtual void copy_group(const boost::shared_ptr<Group> other, const - std::string& path=""); - - /** - * Says if a group with a certain path exists in this group. - */ - virtual bool has_group(const std::string& path) const; - - /** - * Get all datasets attached to this group - */ - virtual const std::map<std::string, boost::shared_ptr<Dataset> >& - datasets() const { - return m_datasets; - } - - /** - * Creates a new HDF5 dataset from scratch and inserts it in this group. - * If the Dataset already exists on file and the types are compatible, we - * attach to that type, otherwise, we raise an exception. - * - * You can set if you would like to have the dataset created as a list - * and the compression level. - * - * The effect of setting "list" to false is that the created dataset: - * - * a) Will not be expandible (chunked) b) Will contain the exact number - * of dimensions of the input type. - * - * When you set "list" to true (the default), datasets are created with - * chunking automatically enabled (the chunk size is set to the size of - * the given variable) and an extra dimension is inserted to accomodate - * list operations. - */ - virtual boost::shared_ptr<Dataset> create_dataset - (const std::string& path, const bob::io::base::HDF5Type& type, bool list=true, - size_t compression=0); - - /** - * Deletes a dataset in this group - * - * Note that removing data already written in a file will only be - * effective in terms of space saving when you actually re-write that - * file. This instruction just unlinks all data from this group and makes - * them inaccessible to any further read operation. - */ - virtual void remove_dataset(const std::string& path); - - /** - * Rename an existing dataset under me. - */ - virtual void rename_dataset(const std::string& from, - const std::string& to); - - /** - * Copies the contents of the given dataset into this. By default, use - * the same name. - */ - virtual void copy_dataset(const boost::shared_ptr<Dataset> other, - const std::string& path=""); - - /** - * Says if a dataset with a certain name exists in the current file. - */ - virtual bool has_dataset(const std::string& path) const; - - /** - * Accesses a certain dataset from this group - */ - boost::shared_ptr<Dataset> operator[] (const std::string& path); - const boost::shared_ptr<Dataset> operator[] (const std::string& path) const; - - /** - * Accesses all existing paths in one shot. Input has to be a std - * container with T = std::string and accepting push_back() - */ - template <typename T> void dataset_paths (T& container) const { - for (std::map<std::string, boost::shared_ptr<io::base::detail::hdf5::Dataset> >::const_iterator it=m_datasets.begin(); it != m_datasets.end(); ++it) container.push_back(it->second->path()); - for (std::map<std::string, boost::shared_ptr<io::base::detail::hdf5::Group> >::const_iterator it=m_groups.begin(); it != m_groups.end(); ++it) it->second->dataset_paths(container); - } - - /** - * Accesses all existing sub-groups in one shot. Input has to be a std - * container with T = std::string and accepting push_back() - */ - template <typename T> void subgroup_paths (T& container, bool recursive = true) const { - for (std::map<std::string, boost::shared_ptr<io::base::detail::hdf5::Group> >::const_iterator it=m_groups.begin(); it != m_groups.end(); ++it){ - container.push_back(it->first); - if (recursive){ - unsigned pos = container.size(); - it->second->subgroup_paths(container); - for (unsigned p = pos; p < container.size(); ++p){ - container[p] = it->first + "/" + container[p]; - } - } - } - } - - /** - * Callback function for group iteration. Two cases are blessed here: - * - * 1. Object is another group. In this case just instantiate the group and - * recursively iterate from there - * 2. Object is a dataset. Instantiate it. - * - * Only hard-links are considered. At the time being, no soft links. - */ - herr_t iterate_callback(hid_t group, const char *name, - const H5L_info_t *info); - - public: //attribute support - - /** - * Gets the current type set for an attribute - */ - void gettype_attribute(const std::string& name, HDF5Type& type) const; - - /** - * Sets a scalar attribute on the current group. Setting an existing - * attribute overwrites its value. - * - * @note Only simple scalars are supported for the time being - */ - template <typename T> void set_attribute(const std::string& name, - const T& v) { - bob::io::base::HDF5Type dest_type(v); - write_attribute(name, dest_type, reinterpret_cast<const void*>(&v)); - } - - /** - * Reads an attribute from the current group. Raises an error if such - * attribute does not exist on the group. To check for existence, use - * has_attribute(). - */ - template <typename T> T get_attribute(const std::string& name) const { - T v; - bob::io::base::HDF5Type dest_type(v); - read_attribute(name, dest_type, reinterpret_cast<void*>(&v)); - return v; - } - - /** - * Checks if a certain attribute exists in this group. - */ - bool has_attribute(const std::string& name) const; - - /** - * Deletes an attribute - */ - void delete_attribute(const std::string& name); - - /** - * List attributes available on this dataset. - */ - void list_attributes(std::map<std::string, bob::io::base::HDF5Type>& attributes) const; - - public: //array attribute support - - /** - * Sets a array attribute on the current group. Setting an existing - * attribute overwrites its value. If the attribute exists it is erased - * and re-written. - */ - template <typename T, int N> void set_array_attribute(const std::string& name, - const blitz::Array<T,N>& v) { - bob::io::base::HDF5Type dest_type(v); - if(!bob::core::array::isCZeroBaseContiguous(v)) { - blitz::Array<T,N> tmp = bob::core::array::ccopy(v); - write_attribute(name, dest_type, reinterpret_cast<const void*>(tmp.data())); - } - else { - write_attribute(name, dest_type, reinterpret_cast<const void*>(v.data())); - } - } - - /** - * Reads an attribute from the current dataset. Raises an error if such - * attribute does not exist on the group. To check for existence, use - * has_attribute(). - */ - template <typename T, int N> blitz::Array<T,N> get_array_attribute - (const std::string& name) const { - blitz::Array<T,N> v; - bob::io::base::HDF5Type dest_type(v); - read_attribute(name, dest_type, reinterpret_cast<void*>(v.data())); - return v; - } - - /** - * Reads an attribute from the current dataset. Places the data in an - * already allocated array. - */ - template <typename T, int N> void get_array_attribute - (const std::string& name, blitz::Array<T,N>& v) const { - bob::io::base::HDF5Type dest_type(v); - read_attribute(name, dest_type, reinterpret_cast<void*>(v.data())); - } - - public: //buffer attribute support - - /** - * Reads an attribute into a user buffer. It is the user's responsibility - * to have a buffer that represents the given type. - */ - void read_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest, void* buffer) const; - - /** - * Writes the contents of a given buffer into the attribute. - */ - void write_attribute (const std::string& name, - const bob::io::base::HDF5Type& dest, const void* buffer); - - private: //not implemented - - /** - * Copies the contents of an existing group -- not implemented - */ - Group(const Group& other); - - /** - * Assigns the contents of an existing group to myself -- not - * implemented - */ - Group& operator= (const Group& other); - - private: //representation - - std::string m_name; ///< my name - boost::shared_ptr<hid_t> m_id; ///< the HDF5 Group this object points to - boost::weak_ptr<Group> m_parent; - std::map<std::string, boost::shared_ptr<Group> > m_groups; - std::map<std::string, boost::shared_ptr<Dataset> > m_datasets; - //std::map<std::string, boost::shared_ptr<Attribute> > m_attributes; - - }; - - /** - * The RootGroup is a special case of the Group object that is directly - * attached to the File (no parents). - */ - class RootGroup: public Group { - - public: //api - - /** - * Binds to the root group of a file. - */ - RootGroup(boost::shared_ptr<File> parent); - - /** - * D'tor - presently, does nothing - */ - virtual ~RootGroup(); - - /** - * Get parent group - */ - virtual const boost::shared_ptr<Group> parent() const { - return boost::shared_ptr<Group>(); - } - - /** - * Get parent group - */ - virtual boost::shared_ptr<Group> parent() { - return boost::shared_ptr<Group>(); - } - - /** - * Filename where I'm sitting - */ - virtual const std::string& filename() const; - - /** - * Full path to myself. Constructed each time it is called. - */ - virtual std::string path() const { - return ""; - } - - /** - * Access file - */ - virtual const boost::shared_ptr<File> file() const { - return m_parent.lock(); - } - - virtual boost::shared_ptr<File> file() { - return m_parent.lock(); - } - - private: //representation - - boost::weak_ptr<File> m_parent; ///< the file I belong to - - }; - - /** - * std::string specialization - */ - template <> void Group::set_attribute<std::string>(const std::string& name, const std::string& v); - template <> std::string Group::get_attribute(const std::string& name) const; - -}}}}} - -#endif /* BOB_IO_BASE_HDF5GROUP_H */ diff --git a/bob/io/base/include/bob.io.base/HDF5Types.h b/bob/io/base/include/bob.io.base/HDF5Types.h deleted file mode 100644 index d19eab3..0000000 --- a/bob/io/base/include/bob.io.base/HDF5Types.h +++ /dev/null @@ -1,508 +0,0 @@ -/** - * @date Wed Jun 22 17:50:08 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief A few helpers to handle HDF5 datasets in a more abstract way. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_HDF5TYPES_H -#define BOB_IO_BASE_HDF5TYPES_H - -#include <vector> -#include <string> -#include <boost/shared_ptr.hpp> -#include <blitz/array.h> -#include <hdf5.h> - -/** - * Checks if the version of HDF5 installed is greater or equal to some set of - * values. (extracted from hdf5-1.8.7) - */ -#ifndef H5_VERSION_GE -#define H5_VERSION_GE(Maj,Min,Rel) \ - (((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR==Min) && (H5_VERS_RELEASE>=Rel)) || \ - ((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR>Min)) || \ - (H5_VERS_MAJOR>Maj)) -#endif - -#include <bob.io.base/array.h> - -namespace bob { namespace io { namespace base { - - /** - * Supported types - */ - typedef enum hdf5type { - s=0, //std::string - b, //bool - i8, //int8_t - i16, //int16_t - i32, //int32_t - i64, //int64_t - u8, //uint8_t - u16, //uint16_t - u32, //uint32_t - u64, //uint64_t - f32, //float - f64, //double - f128, //long double - c64, //std::complex<float> - c128, //std::complex<double> - c256, //std::complex<long double> - unsupported //this must be last - } hdf5type; - - /** - * Converts a hdf5type enumeration into its string representation - */ - const char* stringize (hdf5type t); - - /** - * A wrapper to handle the HDF5 C-API error printing in a nicer way... - */ - class HDF5ErrorStack { - - public: //api - - /** - * Binds the HDF5Error to the current default error stack. - */ - HDF5ErrorStack (); - - /** - * Binds to a specific HDF5 error stack - */ - HDF5ErrorStack (hid_t stack); - - /** - * Destructor virtualization. - */ - virtual ~HDF5ErrorStack(); - - /** - * Returns the currently captured error stack - */ - inline std::vector<std::string>& get() { return m_err; } - - /** - * Clears the current error stack - */ - inline void clear() { m_err.clear(); } - - /** - * Sets muting - */ - inline void mute () { m_muted = true; } - inline void unmute () { m_muted = false; } - inline bool muted () const { return m_muted; } - - private: //not implemented - - HDF5ErrorStack(const HDF5ErrorStack& other); - - HDF5ErrorStack& operator= (const HDF5ErrorStack& other); - - private: //representation - hid_t m_stack; ///< the stack I'm observing - bool m_muted; ///< if I'm currently muted - std::vector<std::string> m_err; ///< the current captured stack - herr_t (*m_func)(hid_t, void*); ///< temporary cache - void* m_client_data; ///< temporary cache - - }; - - // Global default HDF5 error stack - extern const boost::shared_ptr<HDF5ErrorStack> DefaultHDF5ErrorStack; - - /** - * This class defines the shape type: a counter and a variable-size hsize_t - * array that contains the dimensionality of a certain array. Internally, we - * always allocate a fixed size vector with 12 positions (after the maximum - * number of dimensions of a blitz::Array<T,N> + 1). - */ - class HDF5Shape { - -# define MAX_HDF5SHAPE_SIZE 12 - - public: //api - - /** - * Builds a new shape with a certain size and values. The size has to be - * smaller than the maximum number of supported dimensions (12). - */ - template <typename T> HDF5Shape(const size_t n, const T* values): - m_n(n), m_shape() { - if (n > MAX_HDF5SHAPE_SIZE) - throw std::length_error("maximum number of dimensions exceeded"); - for (size_t i=0; i<n; ++i) m_shape[i] = values[i]; - } - - /** - * Builds a new shape with data from a blitz::TinyVector - */ - template <int N> HDF5Shape(const blitz::TinyVector<int,N>& vec): - m_n(N), m_shape() { - if (N > MAX_HDF5SHAPE_SIZE) - throw std::length_error("maximum number of dimensions exceeded"); - for (size_t i=0; i<N; ++i) m_shape[i] = vec[i]; - } - - /** - * Allocates the shape space, but fills all with zeros - */ - HDF5Shape (size_t n); - - /** - * Default constructor (m_n = 0, no shape) - */ - HDF5Shape (); - - /** - * Copy construct the shape - */ - HDF5Shape (const HDF5Shape& other); - - /** - * Virtual destructor - */ - virtual ~HDF5Shape(); - - /** - * Resets this new shape - */ - HDF5Shape& operator= (const HDF5Shape& other); - - /** - * Returns the current size of shape. If values are less than zero, the - * shape is not valid. - */ - inline size_t n () const { return m_n; } - - /** - * Returs a pointer to the first element of the shape - */ - inline const hsize_t* get() const { return m_shape; } - inline hsize_t* get() { return m_shape; } - - /** - * Copies the data from the other HDF5Shape. If the other shape is - * smaller, will copy up to the number of positions in the other shape, - * if it is bigger, will copy up to my number of positions. - */ - void copy(const HDF5Shape& other); - - /** - * Sets a TinyVector with the contents of this shape. If the tinyvector - * shape is smaller, will copy up to the number of positions in the - * current shape. If that is bigger, will copy up to my number of - * positions - */ - template <int N> void set (blitz::TinyVector<int,N>& v) const { - if (N >= m_n) for (size_t i=0; i<m_n; ++i) v[i] = m_shape[i]; - else for (size_t i=0; i<N; ++i) v[i] = m_shape[i]; - } - - /** - * Resets the current shape so it becomes invalid. - */ - void reset(); - - /** - * Accesses a certain position of this shape (unchecked!) - */ - inline const hsize_t& operator[] (size_t pos) const { return m_shape[pos]; } - inline hsize_t& operator[] (size_t pos) { return m_shape[pos]; } - - /** - * Left-shift a number of positions, decreases the total size. - */ - HDF5Shape& operator <<= (size_t pos); - - /** - * Right-shift a number of positions, increases the total size. New - * positions are filled with 1's (ones). - */ - HDF5Shape& operator >>= (size_t pos); - - /** - * Returns the product of all dimensions - */ - hsize_t product() const; - - /** - * Compares two shapes for equality - */ - bool operator== (const HDF5Shape& other) const; - bool operator!= (const HDF5Shape& other) const; - - /** - * Compares a shape with a TinyVector for equality - */ - template <int N> - bool operator== (const blitz::TinyVector<int,N>& other) const { - if (N != m_n) return false; - for (size_t i=0; i<m_n; ++i) if (m_shape[i] != other[i]) return false; - return true; - } - - template <int N> - bool operator!= (const blitz::TinyVector<int,N>& other) const { - return !(*this == other); - } - - /** - * Tells if this shape is invalid - */ - inline bool operator! () const { return m_n == 0; } - - /** - * Returns a tuple-like string representation for this shape - */ - std::string str() const; - - private: //representation - size_t m_n; ///< The number of valid hsize_t's in this shape - hsize_t m_shape[MAX_HDF5SHAPE_SIZE]; ///< The actual shape values - - }; - - /** - * Support to compare data types, convert types into runtime equivalents and - * make our life easier when deciding what to input and output. - */ - class HDF5Type { - - public: - - /** - * Specific implementations bind the type T to the support_t enum - */ -# define DECLARE_SUPPORT(T) HDF5Type(const T& value); - DECLARE_SUPPORT(bool) - DECLARE_SUPPORT(int8_t) - DECLARE_SUPPORT(int16_t) - DECLARE_SUPPORT(int32_t) - DECLARE_SUPPORT(int64_t) - DECLARE_SUPPORT(uint8_t) - DECLARE_SUPPORT(uint16_t) - DECLARE_SUPPORT(uint32_t) - DECLARE_SUPPORT(uint64_t) - DECLARE_SUPPORT(float) - DECLARE_SUPPORT(double) - DECLARE_SUPPORT(long double) - DECLARE_SUPPORT(std::complex<float>) - DECLARE_SUPPORT(std::complex<double>) - DECLARE_SUPPORT(std::complex<long double>) -# undef DECLARE_SUPPORT - - /** - * Builds the type from a string (special HDF5 handling) - */ - HDF5Type(const char* value); - HDF5Type(const std::string& value); - -# define DECLARE_SUPPORT(T,N) HDF5Type(const blitz::Array<T,N>& value); - -# define DECLARE_BZ_SUPPORT(T) \ - DECLARE_SUPPORT(T,1) \ - DECLARE_SUPPORT(T,2) \ - DECLARE_SUPPORT(T,3) \ - DECLARE_SUPPORT(T,4) - - DECLARE_BZ_SUPPORT(bool) - DECLARE_BZ_SUPPORT(int8_t) - DECLARE_BZ_SUPPORT(int16_t) - DECLARE_BZ_SUPPORT(int32_t) - DECLARE_BZ_SUPPORT(int64_t) - DECLARE_BZ_SUPPORT(uint8_t) - DECLARE_BZ_SUPPORT(uint16_t) - DECLARE_BZ_SUPPORT(uint32_t) - DECLARE_BZ_SUPPORT(uint64_t) - DECLARE_BZ_SUPPORT(float) - DECLARE_BZ_SUPPORT(double) - DECLARE_BZ_SUPPORT(long double) - DECLARE_BZ_SUPPORT(std::complex<float>) - DECLARE_BZ_SUPPORT(std::complex<double>) - DECLARE_BZ_SUPPORT(std::complex<long double>) -# undef DECLARE_BZ_SUPPORT -# undef DECLARE_SUPPORT - - /** - * Default constructor, results in an unsupported type with invalid shape - */ - HDF5Type(); - - /** - * Creates a HDF5Type from a type enumeration, assumes it is a scalar - */ - HDF5Type(hdf5type type); - - /** - * Creates a HDF5Type from an bob::io::base::array::typeinfo - */ - HDF5Type(const bob::io::base::array::typeinfo& ti); - - /** - * Creates a HDF5Type from a type enumeration and an explicit shape - */ - HDF5Type(bob::io::base::array::ElementType eltype, const HDF5Shape& extents); - - /** - * Creates a HDF5Type from a type enumeration and an explicit shape - */ - HDF5Type(hdf5type type, const HDF5Shape& extents); - - /** - * Creates a HDF5Type from a HDF5 Dataset, Datatype and Dataspace - */ - HDF5Type(const boost::shared_ptr<hid_t>& type, - const HDF5Shape& extents); - - /** - * Scalar of a certain type - */ - HDF5Type(const boost::shared_ptr<hid_t>& type); - - /** - * Copy construction - */ - HDF5Type(const HDF5Type& other); - - /** - * Virtual destructor - */ - virtual ~HDF5Type(); - - /** - * Assignment - */ - HDF5Type& operator= (const HDF5Type& other); - - /** - * Checks if two types are the same - */ - bool operator== (const HDF5Type& other) const; - - /** - * Checks if two types are *not* the same - */ - bool operator!= (const HDF5Type& other) const; - - /** - * Checks if an existing object is compatible with my type - */ - template <typename T> bool compatible (const T& value) const { - return *this == HDF5Type(value); - } - - /** - * Checks if an existing object is compatible with my type - */ - bool compatible (const bob::io::base::array::typeinfo& value) const; - - /** - * Returns the HDF5Shape of this type - */ - const HDF5Shape& shape() const { return m_shape; } - - /** - * Returns the HDF5Shape of this type - */ - HDF5Shape& shape() { return m_shape; } - - /** - * Returns the equivalent HDF5 type info object for this type. - */ - boost::shared_ptr<hid_t> htype() const; - - /** - * Returns a string representation of this supported type. - */ - std::string str() const; - - /** - * Returns a string representation of the element type. - */ - std::string type_str() const { return stringize(m_type); } - - /** - * Returns the current enumeration for the type - */ - inline hdf5type type() const { return m_type; } - - /** - * Returns a mapping between the current type and the supported element - * types in bob::io::base::array - */ - bob::io::base::array::ElementType element_type() const; - - /** - * Copies this type information to a stock bob::io::base::array::typeinfo - */ - void copy_to (bob::io::base::array::typeinfo& ti) const; - - private: //representation - - hdf5type m_type; ///< the precise supported type - HDF5Shape m_shape; ///< what is the shape of the type (scalar) - - }; - - /** - * Describes ways to read a Dataset. - */ - struct HDF5Descriptor { - - public: //api - - /** - * Constructor - */ - HDF5Descriptor(const HDF5Type& type, size_t size = 0, bool expand = true); - - /** - * Copy constructor - */ - HDF5Descriptor(const HDF5Descriptor& other); - - /** - * Virtual destructor - */ - virtual ~HDF5Descriptor(); - - /** - * Assignment - */ - HDF5Descriptor& operator= (const HDF5Descriptor& other); - - /** - * Setup myself as I was supposed to be read from a space with N+1 - * dimensions. - */ - HDF5Descriptor& subselect(); - - public: //representation - - HDF5Type type; ///< base type for read/write operations - size_t size; ///< number of objects of this type stored at dataset - bool expandable; ///< is this dataset expandable using this type? - - /** - * Variables required for fast read/write operations. - */ - HDF5Shape hyperslab_start; ///< offset to read/write operations - HDF5Shape hyperslab_count; ///< count for read/write operations - - }; - - /** - * Format and returns the current HDF5 error stack. It also clears the stack - * before returning. - */ - std::string format_hdf5_error(); - -}}} - -#endif /* BOB_IO_BASE_HDF5TYPES_H */ diff --git a/bob/io/base/include/bob.io.base/HDF5Utils.h b/bob/io/base/include/bob.io.base/HDF5Utils.h deleted file mode 100644 index 670430e..0000000 --- a/bob/io/base/include/bob.io.base/HDF5Utils.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @date Wed Jun 22 17:50:08 2011 +0200 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief A bunch of private utilities to make programming against the HDF5 - * library a little bit more confortable. - * - * Classes and non-member methods in this file handle the low-level HDF5 C-API - * and try to make it a little bit safer and higher-level for use by the - * publicly visible HDF5File class. The functionality here is heavily based on - * boost::shared_ptr's for handling automatic deletion and releasing of HDF5 - * objects. Two top-level classes do the whole work: File and Dataset. The File - * class represents a raw HDF5 file. You can iterate with it in a very limited - * way: create one, rename an object or delete one. The Dataset object - * encapsulates reading and writing of data from a specific HDF5 dataset. - * Everything is handled automatically and the user should not have to worry - * about it too much. - * - * @todo Missing support for list<std::string> - * @todo Inprint file creation time, author, comments? - * @todo Missing support for automatic endianness conversion - * @todo Missing true support for scalars - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_HDF5UTILS_H -#define BOB_IO_BASE_HDF5UTILS_H - -#include <boost/filesystem.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/enable_shared_from_this.hpp> -#include <hdf5.h> - -#include <bob.io.base/HDF5Group.h> - -namespace bob { namespace io { namespace base { namespace detail { namespace hdf5 { - - /** - * An HDF5 C-style file that knows how to close itself. - */ - class File: public boost::enable_shared_from_this<File> { - - public: - - /** - * Creates a new HDF5 file. Optionally set the userblock size (multiple - * of 2 number of bytes). - */ - File(const boost::filesystem::path& path, unsigned int flags, - size_t userblock_size=0); - - /** - * Copies a file by creating a copy of each of its groups - */ - File(const File& other); - - /** - * Destructor virtualization - */ - virtual ~File(); - - /** - * Assignment - */ - File& operator= (const File& other); - - /** - * Accesses the current location id of this file - */ - const boost::shared_ptr<hid_t> location() const { - return m_id; - } - boost::shared_ptr<hid_t> location() { - return m_id; - } - - /** - * Returns the userblock size - */ - size_t userblock_size() const; - - /** - * Copies the userblock into a string -- not yet implemented. If you want - * to do it, read the code for the command-line utilitlies h5jam and - * h5unjam. - */ - void get_userblock(std::string& data) const; - - /** - * Writes new data to the user block. Data is truncated up to the size - * set during file creation -- not yet implemented. If you want to do it, - * read the code for the command-line utilitlies h5jam and h5unjam. - */ - void set_userblock(const std::string& data); - - /** - * Gets the current path - */ - const std::string& filename() const { - return m_path.string(); - } - - /** - * Returns the root group - */ - boost::shared_ptr<RootGroup> root(); - - /** - * Resets this file, sets to read again all groups and datasets - */ - void reset(); - - /** - * Flushes the current content of the file to disk - */ - void flush(); - - /** - * Tells if this file is writable - */ - bool writable() const; - - private: //representation - - const boost::filesystem::path m_path; ///< path to the file - unsigned int m_flags; ///< flags used to open it - boost::shared_ptr<hid_t> m_fcpl; ///< file creation property lists - boost::shared_ptr<hid_t> m_id; ///< the HDF5 id attributed to this file. - boost::shared_ptr<RootGroup> m_root; - }; - -}}}}} - -#endif /* BOB_IO_BASE_HDF5UTILS_H */ diff --git a/bob/io/base/include/bob.io.base/api.h b/bob/io/base/include/bob.io.base/api.h deleted file mode 100644 index fe714e4..0000000 --- a/bob/io/base/include/bob.io.base/api.h +++ /dev/null @@ -1,304 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Tue 5 Nov 12:22:48 2013 - * - * @brief Python API for bob::io::base - */ - -#ifndef BOB_IO_BASE_H -#define BOB_IO_BASE_H - -/* Define Module Name and Prefix for other Modules - Note: We cannot use BOB_EXT_* macros here, unfortunately */ -#define BOB_IO_BASE_PREFIX "bob.io.base" -#define BOB_IO_BASE_FULL_NAME "bob.io.base._library" - -#include <Python.h> - -#include <bob.io.base/config.h> -#include <bob.io.base/File.h> -#include <bob.io.base/CodecRegistry.h> -#include <bob.io.base/HDF5File.h> - -#include <boost/shared_ptr.hpp> - -/******************* - * C API functions * - *******************/ - -/* Enum defining entries in the function table */ -enum _PyBobIo_ENUM{ - PyBobIo_APIVersion_NUM = 0, - // Bindings for bob.io.base.File - PyBobIoFile_Type_NUM, - PyBobIoFileIterator_Type_NUM, - // I/O generic bindings - PyBobIo_AsTypenum_NUM, - PyBobIo_TypeInfoAsTuple_NUM, - PyBobIo_FilenameConverter_NUM, - // HDF5 bindings - PyBobIoHDF5File_Type_NUM, - PyBobIoHDF5File_Check_NUM, - PyBobIoHDF5File_Converter_NUM, - // Codec registration and de-registration - PyBobIoCodec_Register_NUM, - PyBobIoCodec_Deregister_NUM, - PyBobIoCodec_IsRegistered_NUM, - PyBobIoCodec_GetDescription_NUM, - // Total number of C API pointers - PyBobIo_API_pointers -}; - -/************** - * Versioning * - **************/ - -#define PyBobIo_APIVersion_TYPE int - -/********************************** - * Bindings for bob.io.base.File * - **********************************/ - -/* Type definition for PyBobIoFileObject */ -typedef struct { - PyObject_HEAD - - /* Type-specific fields go here. */ - boost::shared_ptr<bob::io::base::File> f; - -} PyBobIoFileObject; - -#define PyBobIoFile_Type_TYPE PyTypeObject - -typedef struct { - PyObject_HEAD - - /* Type-specific fields go here. */ - PyBobIoFileObject* pyfile; - Py_ssize_t curpos; - -} PyBobIoFileIteratorObject; - -#define PyBobIoFileIterator_Type_TYPE PyTypeObject - -/************************ - * I/O generic bindings * - ************************/ - -#define PyBobIo_AsTypenum_RET int -#define PyBobIo_AsTypenum_PROTO (bob::io::base::array::ElementType et) - -#define PyBobIo_TypeInfoAsTuple_RET PyObject* -#define PyBobIo_TypeInfoAsTuple_PROTO (const bob::io::base::array::typeinfo& ti) - -#define PyBobIo_FilenameConverter_RET int -#define PyBobIo_FilenameConverter_PROTO (PyObject* o, const char** b) - -/***************** - * HDF5 bindings * - *****************/ - -typedef struct { - PyObject_HEAD - - /* Type-specific fields go here. */ - boost::shared_ptr<bob::io::base::HDF5File> f; - -} PyBobIoHDF5FileObject; - -#define PyBobIoHDF5File_Type_TYPE PyTypeObject - -#define PyBobIoHDF5File_Check_RET int -#define PyBobIoHDF5File_Check_PROTO (PyObject* o) - -#define PyBobIoHDF5File_Converter_RET int -#define PyBobIoHDF5File_Converter_PROTO (PyObject* o, PyBobIoHDF5FileObject** a) - -/***************************************** - * Code Registration and De-registration * - *****************************************/ - -#define PyBobIoCodec_Register_RET int -#define PyBobIoCodec_Register_PROTO (const char* extension, const char* description, bob::io::base::file_factory_t factory) - -#define PyBobIoCodec_Deregister_RET int -#define PyBobIoCodec_Deregister_PROTO (const char* extension) - -#define PyBobIoCodec_IsRegistered_RET int -#define PyBobIoCodec_IsRegistered_PROTO (const char* extension) - -#define PyBobIoCodec_GetDescription_RET const char* -#define PyBobIoCodec_GetDescription_PROTO (const char* extension) - -#ifdef BOB_IO_BASE_MODULE - - /* This section is used when compiling `bob.io.base' itself */ - - /************** - * Versioning * - **************/ - - extern int PyBobIo_APIVersion; - - /********************************** - * Bindings for bob.io.base.File * - **********************************/ - - extern PyBobIoFile_Type_TYPE PyBobIoFile_Type; - extern PyBobIoFileIterator_Type_TYPE PyBobIoFileIterator_Type; - - /************************ - * I/O generic bindings * - ************************/ - - PyBobIo_AsTypenum_RET PyBobIo_AsTypenum PyBobIo_AsTypenum_PROTO; - - PyBobIo_TypeInfoAsTuple_RET PyBobIo_TypeInfoAsTuple PyBobIo_TypeInfoAsTuple_PROTO; - - PyBobIo_FilenameConverter_RET PyBobIo_FilenameConverter PyBobIo_FilenameConverter_PROTO; - -/***************** - * HDF5 bindings * - *****************/ - - extern PyBobIoHDF5File_Type_TYPE PyBobIoHDF5File_Type; - - PyBobIoHDF5File_Check_RET PyBobIoHDF5File_Check PyBobIoHDF5File_Check_PROTO; - - PyBobIoHDF5File_Converter_RET PyBobIoHDF5File_Converter PyBobIoHDF5File_Converter_PROTO; - -/***************************************** - * Code Registration and De-registration * - *****************************************/ - - PyBobIoCodec_Register_RET PyBobIoCodec_Register PyBobIoCodec_Register_PROTO; - - PyBobIoCodec_Deregister_RET PyBobIoCodec_Deregister PyBobIoCodec_Deregister_PROTO; - - PyBobIoCodec_IsRegistered_RET PyBobIoCodec_IsRegistered PyBobIoCodec_IsRegistered_PROTO; - - PyBobIoCodec_GetDescription_RET PyBobIoCodec_GetDescription PyBobIoCodec_GetDescription_PROTO; - -#else // BOB_IO_BASE_MODULE - - /* This section is used in modules that use `bob.io.base's' C-API */ - -# if defined(NO_IMPORT_ARRAY) - extern void **PyBobIo_API; -# else -# if defined(PY_ARRAY_UNIQUE_SYMBOL) - void **PyBobIo_API; -# else - static void **PyBobIo_API=NULL; -# endif -# endif - - /************** - * Versioning * - **************/ - -# define PyBobIo_APIVersion (*(PyBobIo_APIVersion_TYPE *)PyBobIo_API[PyBobIo_APIVersion_NUM]) - - /***************************** - * Bindings for bob.io.File * - *****************************/ - -# define PyBobIoFile_Type (*(PyBobIoFile_Type_TYPE *)PyBobIo_API[PyBobIoFile_Type_NUM]) -# define PyBobIoFileIterator_Type (*(PyBobIoFileIterator_Type_TYPE *)PyBobIo_API[PyBobIoFileIterator_Type_NUM]) - - /************************ - * I/O generic bindings * - ************************/ - -# define PyBobIo_AsTypenum (*(PyBobIo_AsTypenum_RET (*)PyBobIo_AsTypenum_PROTO) PyBobIo_API[PyBobIo_AsTypenum_NUM]) - -# define PyBobIo_TypeInfoAsTuple (*(PyBobIo_TypeInfoAsTuple_RET (*)PyBobIo_TypeInfoAsTuple_PROTO) PyBobIo_API[PyBobIo_TypeInfoAsTuple_NUM]) - -# define PyBobIo_FilenameConverter (*(PyBobIo_FilenameConverter_RET (*)PyBobIo_FilenameConverter_PROTO) PyBobIo_API[PyBobIo_FilenameConverter_NUM]) - - /***************** - * HDF5 bindings * - *****************/ - -# define PyBobIoHDF5File_Type (*(PyBobIoHDF5File_Type_TYPE *)PyBobIo_API[PyBobIoHDF5File_Type_NUM]) - -# define PyBobIoHDF5File_Check (*(PyBobIoHDF5File_Check_RET (*)PyBobIoHDF5File_Check_PROTO) PyBobIo_API[PyBobIoHDF5File_Check_NUM]) - -# define PyBobIoHDF5File_Converter (*(PyBobIoHDF5File_Converter_RET (*)PyBobIoHDF5File_Converter_PROTO) PyBobIo_API[PyBobIoHDF5File_Converter_NUM]) - -/***************************************** - * Code Registration and De-registration * - *****************************************/ - -# define PyBobIoCodec_Register (*(PyBobIoCodec_Register_RET (*)PyBobIoCodec_Register_PROTO) PyBobIo_API[PyBobIoCodec_Register_NUM]) - -# define PyBobIoCodec_Deregister (*(PyBobIoCodec_Deregister_RET (*)PyBobIoCodec_Deregister_PROTO) PyBobIo_API[PyBobIoCodec_Deregister_NUM]) - -# define PyBobIoCodec_IsRegistered (*(PyBobIoCodec_IsRegistered_RET (*)PyBobIoCodec_IsRegistered_PROTO) PyBobIo_API[PyBobIoCodec_IsRegistered_NUM]) - -# define PyBobIoCodec_GetDescription (*(PyBobIoCodec_GetDescription_RET (*)PyBobIoCodec_GetDescription_PROTO) PyBobIo_API[PyBobIoCodec_GetDescription_NUM]) - -# if !defined(NO_IMPORT_ARRAY) - - /** - * Returns -1 on error, 0 on success. - */ - static int import_bob_io_base(void) { - - PyObject *c_api_object; - PyObject *module; - - module = PyImport_ImportModule(BOB_IO_BASE_FULL_NAME); - - if (module == NULL) return -1; - - c_api_object = PyObject_GetAttrString(module, "_C_API"); - - if (c_api_object == NULL) { - Py_DECREF(module); - return -1; - } - -# if PY_VERSION_HEX >= 0x02070000 - if (PyCapsule_CheckExact(c_api_object)) { - PyBobIo_API = (void **)PyCapsule_GetPointer(c_api_object, - PyCapsule_GetName(c_api_object)); - } -# else - if (PyCObject_Check(c_api_object)) { - PyBobIo_API = (void **)PyCObject_AsVoidPtr(c_api_object); - } -# endif - - Py_DECREF(c_api_object); - Py_DECREF(module); - - if (!PyBobIo_API) { - PyErr_SetString(PyExc_ImportError, "cannot find C/C++ API " -# if PY_VERSION_HEX >= 0x02070000 - "capsule" -# else - "cobject" -# endif - " at `" BOB_IO_BASE_FULL_NAME "._C_API'"); - return -1; - } - - /* Checks that the imported version matches the compiled version */ - int imported_version = *(int*)PyBobIo_API[PyBobIo_APIVersion_NUM]; - - if (BOB_IO_BASE_API_VERSION != imported_version) { - PyErr_Format(PyExc_ImportError, BOB_IO_BASE_FULL_NAME " import error: you compiled against API version 0x%04x, but are now importing an API with version 0x%04x which is not compatible - check your Python runtime environment for errors", BOB_IO_BASE_API_VERSION, imported_version); - return -1; - } - - /* If you get to this point, all is good */ - return 0; - - } - -# endif //!defined(NO_IMPORT_ARRAY) - -#endif /* BOB_IO_BASE_MODULE */ - -#endif /* BOB_IO_BASE_H */ diff --git a/bob/io/base/include/bob.io.base/array.h b/bob/io/base/include/bob.io.base/array.h deleted file mode 100644 index 570c09f..0000000 --- a/bob/io/base/include/bob.io.base/array.h +++ /dev/null @@ -1,255 +0,0 @@ -/** - * @date Tue Nov 8 15:34:31 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief The array API describes a non-specific way to handle N dimensional - * array data. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_ARRAY_INTERFACE_H -#define BOB_IO_BASE_ARRAY_INTERFACE_H - -#include <stdexcept> -#include <string> - -#include <boost/shared_ptr.hpp> -#include <blitz/array.h> - -#include <bob.io.base/array_type.h> - -/* MinGW flags */ -#ifdef _WIN32 -#undef interface -#endif - -/** - * @brief Array submodule API of the I/O module - */ -namespace bob { namespace io { namespace base { namespace array { - - /** - * @brief Encapsulation of special type information of interfaces. - */ - struct typeinfo { - - ElementType dtype; ///< data type - size_t nd; ///< number of dimensions - size_t shape[BOB_MAX_DIM+1]; ///< length along each dimension - size_t stride[BOB_MAX_DIM+1]; ///< strides along each dimension - - /** - * @brief Default constructor - */ - typeinfo(); - - /** - * @brief Simplification to build a typeinfo from a size - */ - template <typename T> typeinfo(ElementType dtype_, T nd_) { - set(dtype_, nd_); - } - - /** - * @brief Simplification to build a typeinfo from a shape pointer. - */ - template <typename T> typeinfo(ElementType dtype_, T nd_, const T* shape_) { - set(dtype_, nd_, shape_); - } - - /** - * @brief Copies information from another typeinfo - */ - typeinfo(const typeinfo& other); - - /** - * @brief Assignment - */ - typeinfo& operator= (const typeinfo& other); - - /** - * @brief Builds with type and number of dimensions, but set the shape and - * strides to all zeros. - */ - template <typename T> - void set(ElementType dtype_, T nd_) { - dtype = dtype_; - nd = nd_; - reset_shape(); - } - - /** - * @brief Set to specific values - */ - template <typename T> - void set(ElementType dtype_, T nd_, const T* shape_) { - dtype = dtype_; - set_shape(nd_, shape_); - } - - /** - * @brief Set to specific values, including strides - */ - template <typename T> - void set(ElementType dtype_, T nd_, const T* shape_, - const T* stride_) { - dtype = dtype_; - nd = nd_; - for (size_t k=0; k<nd; ++k) { - shape[k] = shape_[k]; - stride[k] = stride_[k]; - } - } - - /** - * @brief Reset to defaults -- as if uninitialized. - */ - void reset(); - - /** - * @brief Is this a valid type information? - */ - bool is_valid() const; - - /** - * @brief Does this has a valid shape information? - */ - bool has_valid_shape() const; - - /** - * @brief sets the shape - */ - template <typename T> void set_shape(T nd_, const T* shape_) { - if (nd_ > (BOB_MAX_DIM+1)) - throw std::runtime_error("unsupported number of dimensions"); - nd = nd_; - for (size_t k=0; k<nd; ++k) shape[k] = shape_[k]; - update_strides(); - } - - /** - * @brief resets the shape to all zeros - */ - void reset_shape(); - - /** - * @brief Update my own stride vector. Called automatically after any use - * of set_shape(). - */ - void update_strides(); - - /** - * @brief Returns the total number of elements available - */ - size_t size() const; - - /** - * @brief Returns the size of each element - */ - inline size_t item_size() const { return getElementSize(dtype); } - - /** - * @brief Returns the total size (in bytes) of the buffer that I'm - * associated with. - */ - size_t buffer_size() const; - - /** - * @brief Returns the item type description - */ - const char* item_str() const { return stringize(dtype); } - - /** - * @brief Checks compatibility with other typeinfo - */ - bool is_compatible(const typeinfo& other) const; - - /** - * @brief Formats and returns a string containing the full typeinfo - * description. - */ - std::string str() const; - - /** - * @brief Make it easy to set for blitz::Array<T,N> - */ - template <typename T, int N> void set(const blitz::Array<T,N>& array) { - dtype = getElementType<T>(); - set_shape(array.shape()); - } - - template <typename T, int N> - void set(boost::shared_ptr<blitz::Array<T,N> >& array) { - dtype = getElementType<T>(); - set_shape(array->shape()); - } - - template <int N> void set_shape(const blitz::TinyVector<int,N>& tv_shape) { - nd = N; - for (size_t k=0; k<nd; ++k) shape[k] = tv_shape(k); - update_strides(); - } - - }; - - /** - * @brief The interface manager introduces a concept for managing the - * interfaces that can be handled as C-style arrays. It encapsulates methods - * to store and delete the buffer contents in a safe way. - * - * The interface is an entity that either stores a copy of its own data or - * refers to data belonging to another interface. - */ - class interface { - - public: //api - - /** - * @brief By default, the interface is never freed. You must override - * this method to do something special for your class type. - */ - virtual ~interface() { } - - /** - * @brief Copies the data from another interface. - */ - virtual void set(const interface& other) =0; - - /** - * @brief Refers to the data of another interface. - */ - virtual void set(boost::shared_ptr<interface> other) =0; - - /** - * @brief Re-allocates this interface taking into consideration new - * requirements. The internal memory should be considered uninitialized. - */ - virtual void set (const typeinfo& req) =0; - - /** - * @brief Type information for this interface. - */ - virtual const typeinfo& type() const =0; - - /** - * @brief Borrows a reference from the underlying memory. This means - * this object continues to be responsible for deleting the memory and - * you should make sure that it outlives the usage of the returned - * pointer. - */ - virtual void* ptr() =0; - virtual const void* ptr() const =0; - - /** - * @brief Returns a representation of the internal cache using shared - * pointers. - */ - virtual boost::shared_ptr<void> owner() =0; - virtual boost::shared_ptr<const void> owner() const =0; - - }; - -}}}} - -#endif /* BOB_IO_BASE_ARRAY_INTERFACE_H */ diff --git a/bob/io/base/include/bob.io.base/array_type.h b/bob/io/base/include/bob.io.base/array_type.h deleted file mode 100644 index 89eb1e2..0000000 --- a/bob/io/base/include/bob.io.base/array_type.h +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @date Sat Apr 9 18:10:10 2011 +0200 - * @author Laurent El Shafey <Laurent.El-Shafey@idiap.ch> - * - * @brief This file contains information about the supported arrays - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_ARRAY_TYPE_H -#define BOB_IO_BASE_ARRAY_TYPE_H - -#include <stdint.h> -#include <cstdlib> -#include <complex> - -/** - * @ingroup IO_ARRAY - * @brief This macro defines the maximum number of dimensions supported by bob. - * A variable in the bob.io.array namespace is created from this macro - * receiving the same value. Use that variable on your programs, or this macro - * on your preprocessor code. - */ -#define BOB_MAX_DIM 4 - -namespace bob { namespace io { namespace base { namespace array { - - /** - * @brief Enumeration of the supported type for multidimensional arrays - * @warning float128 and complex256 are defined but currently not - * supported - */ - typedef enum ElementType { - t_unknown=0, - t_bool=1, - t_int8=2, - t_int16=3, - t_int32=4, - t_int64=5, - t_uint8=6, - t_uint16=7, - t_uint32=8, - t_uint64=9, - t_float32=10, - t_float64=11, - t_float128=12, - t_complex64=13, - t_complex128=14, - t_complex256=15 - } ElementType; - - /** - * @brief Maximum number of supported dimensions for multidimensional - * arrays. - */ - const size_t N_MAX_DIMENSIONS_ARRAY = BOB_MAX_DIM; - - /** - * @brief These are some type to element type conversions - */ - template<typename T> ElementType getElementType() { - return t_unknown; - } - - /** - * @brief Some specializations that convert type to element type. - */ - template<> inline ElementType getElementType<bool>() { return t_bool; } - template<> inline ElementType getElementType<int8_t>() { return t_int8; } - template<> inline ElementType getElementType<int16_t>() - { return t_int16; } - template<> inline ElementType getElementType<int32_t>() - { return t_int32; } - template<> inline ElementType getElementType<int64_t>() - { return t_int64; } - template<> inline ElementType getElementType<uint8_t>() - { return t_uint8; } - template<> inline ElementType getElementType<uint16_t>() - { return t_uint16; } - template<> inline ElementType getElementType<uint32_t>() - { return t_uint32; } - template<> inline ElementType getElementType<uint64_t>() - { return t_uint64; } - template<> inline ElementType getElementType<float>() - { return t_float32; } - template<> inline ElementType getElementType<double>() - { return t_float64; } - template<> inline ElementType getElementType<long double>() - { return t_float128; } - template<> inline ElementType getElementType<std::complex<float> >() - { return t_complex64; } - template<> inline ElementType getElementType<std::complex<double> >() - { return t_complex128; } - template<> inline ElementType getElementType<std::complex<long double> >() - { return t_complex256; } - - /** - * @brief These are some type to element size conversions - */ - template<typename T> size_t getElementSize() { - return 0; - } - - /** - * @brief Some specializations that convert the types we handle properly - */ - template<> inline size_t getElementSize<bool>() { return sizeof(bool); } - template<> inline size_t getElementSize<int8_t>() - { return sizeof(int8_t); } - template<> inline size_t getElementSize<int16_t>() - { return sizeof(int16_t); } - template<> inline size_t getElementSize<int32_t>() - { return sizeof(int32_t); } - template<> inline size_t getElementSize<int64_t>() - { return sizeof(int64_t); } - template<> inline size_t getElementSize<uint8_t>() - { return sizeof(uint8_t); } - template<> inline size_t getElementSize<uint16_t>() - { return sizeof(uint16_t); } - template<> inline size_t getElementSize<uint32_t>() - { return sizeof(uint32_t); } - template<> inline size_t getElementSize<uint64_t>() - { return sizeof(uint64_t); } - template<> inline size_t getElementSize<float>() - { return sizeof(float); } - template<> inline size_t getElementSize<double>() - { return sizeof(double); } - template<> inline size_t getElementSize<long double>() - { return sizeof(long double); } - template<> inline size_t getElementSize<std::complex<float> >() - { return sizeof(std::complex<float>); } - template<> inline size_t getElementSize<std::complex<double> >() - { return sizeof(std::complex<double>); } - template<> inline size_t getElementSize<std::complex<long double> >() - { return sizeof(std::complex<long double>); } - - /** - * @brief Returns the type size given the enumeration - */ - size_t getElementSize(ElementType t); - - /** - * @brief Gets a string representation of an element type value - */ - const char* stringize(ElementType t); - - /** - * @brief Equivalent to call stringize() on the result of - * getElementType<T>(). - */ - template<typename T> const char* stringize() { - return stringize(getElementType<T>()); - } - - /** - * @brief Returns the ElementType given the string representation - */ - ElementType unstringize(const char* name); - -}}}} - -#endif /* BOB_IO_BASE_ARRAY_TYPE_H */ diff --git a/bob/io/base/include/bob.io.base/array_utils.h b/bob/io/base/include/bob.io.base/array_utils.h deleted file mode 100644 index 8fdfa77..0000000 --- a/bob/io/base/include/bob.io.base/array_utils.h +++ /dev/null @@ -1,133 +0,0 @@ -/** - * @date Tue Nov 8 15:34:31 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Utilities for converting data to-from blitz::Arrays and other - * goodies. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_ARRAY_UTILS_H -#define BOB_IO_BASE_ARRAY_UTILS_H - -#include <blitz/array.h> -#include <stdint.h> -#include <stdexcept> -#include <boost/format.hpp> - -#include <bob.core/cast.h> -#include <bob.io.base/array.h> - -namespace bob { namespace io { namespace base { namespace array { - - /** - * @brief Fills in shape and stride starting from a typeinfo object - */ - template <int N> void set_shape_and_stride(const typeinfo& info, - blitz::TinyVector<int,N>& shape, blitz::TinyVector<int,N>& stride) { - for (int k=0; k<N; ++k) { - shape[k] = info.shape[k]; - stride[k] = info.stride[k]; - } - } - - - /** - * @brief Takes a data pointer and assumes it is a C-style array for the - * defined type. Creates a wrapper as a blitz::Array<T,N> with the same - * number of dimensions and type. Notice that the blitz::Array<> created - * will have its memory tied to the passed buffer. In other words you have - * to make sure that the buffer outlives the returned blitz::Array<>. - */ - template <typename T, int N> - blitz::Array<T,N> wrap(const interface& buf) { - - const typeinfo& type = buf.type(); - - if (!buf.ptr()) throw std::runtime_error("empty buffer"); - - if (type.dtype != bob::io::base::array::getElementType<T>()) { - boost::format m("cannot efficiently retrieve blitz::Array<%s,%d> from buffer of type '%s'"); - m % stringize<T>() % N % type.str(); - throw std::runtime_error(m.str()); - } - - if (type.nd != N) { - boost::format m("cannot retrieve blitz::Array<%s,%d> from buffer of type '%s'"); - m % stringize<T>() % N % type.str(); - throw std::runtime_error(m.str()); - } - - blitz::TinyVector<int,N> shape; - blitz::TinyVector<int,N> stride; - set_shape_and_stride(type, shape, stride); - - return blitz::Array<T,N>((T*)buf.ptr(), - shape, stride, blitz::neverDeleteData); - } - - - /** - * @brief Takes a data pointer and assumes it is a C-style array for the - * defined type. Creates a copy as a blitz::Array<T,N> with the same number - * of dimensions, but with a type as specified by you. If the type does not - * match the type of the original C-style array, a cast will happen. - * - * If a certain type cast is not supported. An appropriate exception will - * be raised. - */ - template <typename T, int N> - blitz::Array<T,N> cast(const interface& buf) { - - const typeinfo& type = buf.type(); - - if (type.nd != N) { - boost::format m("cannot cast blitz::Array<%s,%d> from buffer of type '%s'"); - m % stringize<T>() % N % type.str(); - throw std::runtime_error(m.str()); - } - - switch (type.dtype) { - case bob::io::base::array::t_bool: - return bob::core::array::cast<T>(wrap<bool,N>(buf)); - case bob::io::base::array::t_int8: - return bob::core::array::cast<T>(wrap<int8_t,N>(buf)); - case bob::io::base::array::t_int16: - return bob::core::array::cast<T>(wrap<int16_t,N>(buf)); - case bob::io::base::array::t_int32: - return bob::core::array::cast<T>(wrap<int32_t,N>(buf)); - case bob::io::base::array::t_int64: - return bob::core::array::cast<T>(wrap<int64_t,N>(buf)); - case bob::io::base::array::t_uint8: - return bob::core::array::cast<T>(wrap<uint8_t,N>(buf)); - case bob::io::base::array::t_uint16: - return bob::core::array::cast<T>(wrap<uint16_t,N>(buf)); - case bob::io::base::array::t_uint32: - return bob::core::array::cast<T>(wrap<uint32_t,N>(buf)); - case bob::io::base::array::t_uint64: - return bob::core::array::cast<T>(wrap<uint64_t,N>(buf)); - case bob::io::base::array::t_float32: - return bob::core::array::cast<T>(wrap<float,N>(buf)); - case bob::io::base::array::t_float64: - return bob::core::array::cast<T>(wrap<double,N>(buf)); - case bob::io::base::array::t_float128: - return bob::core::array::cast<T>(wrap<long double,N>(buf)); - case bob::io::base::array::t_complex64: - return bob::core::array::cast<T>(wrap<std::complex<float>,N>(buf)); - case bob::io::base::array::t_complex128: - return bob::core::array::cast<T>(wrap<std::complex<double>,N>(buf)); - case bob::io::base::array::t_complex256: - return bob::core::array::cast<T>(wrap<std::complex<long double>,N>(buf)); - default: - break; - } - - //if we get to this point, there is nothing much we can do... - throw std::runtime_error("invalid type on blitz buffer array casting -- debug me"); - - } - -}}}} - -#endif /* BOB_IO_BASE_ARRAY_UTILS_H */ diff --git a/bob/io/base/include/bob.io.base/blitz_array.h b/bob/io/base/include/bob.io.base/blitz_array.h deleted file mode 100644 index 083ec1d..0000000 --- a/bob/io/base/include/bob.io.base/blitz_array.h +++ /dev/null @@ -1,261 +0,0 @@ -/** - * @date Tue Nov 8 15:34:31 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief A class that implements the polimorphic behaviour required when - * reading and writing blitz arrays to disk or memory. - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_BLITZ_ARRAY_H -#define BOB_IO_BASE_BLITZ_ARRAY_H - -#include <stdexcept> -#include <boost/make_shared.hpp> -#include <boost/format.hpp> -#include <blitz/array.h> - -#include <bob.core/check.h> -#include <bob.core/cast.h> -#include <bob.core/array_copy.h> - -#include <bob.io.base/array.h> -#include <bob.io.base/array_utils.h> -#include <bob.io.base/array_type.h> - -namespace bob { namespace io { namespace base { namespace array { - - /** - * @brief A blitz::Array representation of an array. - */ - class blitz_array: public interface { - - public: - - /** - * @brief Starts by refering to the data from another blitz array. - */ - blitz_array(boost::shared_ptr<blitz_array> other); - - /** - * @brief Starts by copying the data from another blitz array. - */ - blitz_array(const blitz_array& other); - - /** - * @brief Starts by refering to the data from another buffer. - */ - blitz_array(boost::shared_ptr<interface> other); - - /** - * @brief Starts by copying the data from another buffer. - */ - blitz_array(const interface& other); - - /** - * @brief Starts with an uninitialized, pre-allocated array. - */ - blitz_array(const typeinfo& info); - - /** - * @brief Borrows the given pointer - if you use this constructor, you - * must make sure the pointed data outlives this object. - */ - blitz_array(void* data, const typeinfo& info); - - /** - * @brief Destroyes me - */ - virtual ~blitz_array(); - - /** - * @brief Copies the data from another buffer. - */ - virtual void set(const interface& other); - - /** - * @brief Refers to the data of another buffer. - */ - virtual void set(boost::shared_ptr<interface> other); - - /** - * @brief Re-allocates this buffer taking into consideration new - * requirements. The internal memory should be considered uninitialized. - */ - virtual void set (const typeinfo& req); - - /** - * @brief Refers to the data of another blitz array. - */ - void set(boost::shared_ptr<blitz_array> other); - - /** - * @brief Element type - */ - virtual const typeinfo& type() const { return m_type; } - - /** - * @brief Borrows a reference from the underlying memory. This means - * this object continues to be responsible for deleting the memory and - * you should make sure that it outlives the usage of the returned - * pointer. - */ - virtual void* ptr() { return m_ptr; } - virtual const void* ptr() const { return m_ptr; } - - virtual boost::shared_ptr<void> owner() { return m_data; } - virtual boost::shared_ptr<const void> owner() const { return m_data; } - - - /****************************************************************** - * Blitz Array specific manipulations - ******************************************************************/ - - - /** - * @brief Starts me with new arbitrary data. Please note we refer to the - * given array. External modifications to the array memory will affect - * me. If you don't want that to be the case, use the const variant. - */ - template <typename T, int N> - blitz_array(boost::shared_ptr<blitz::Array<T,N> > data) { - set(data); - } - - /** - * @brief Starts me with new arbitrary data. Please note we copy the - * given array. External modifications to the array memory will not - * affect me. If you don't want that to be the case, start with a - * non-const reference. - */ - template <typename T, int N> - blitz_array(const blitz::Array<T,N>& data) { - set(data); - } - - /** - * @brief Starts me with new arbitrary data. Please note we don't copy - * the given array. - * @warning Any resize of the given blitz::Array after this call leads to - * unexpected results - */ - template <typename T, int N> - blitz_array(blitz::Array<T,N>& data) { - set(data); - } - - /** - * @brief This method will set my internal data to the value you - * specify. We will do this by referring to the data you gave. - */ - template <typename T, int N> - void set(boost::shared_ptr<blitz::Array<T,N> > data) { - - if (getElementType<T>() == t_unknown) - throw std::runtime_error("unsupported element type on blitz::Array<>"); - if (N > BOB_MAX_DIM) - throw std::runtime_error("unsupported number of dimensions on blitz::Array<>"); - - if (!bob::core::array::isCContiguous(*data.get())) - throw std::runtime_error("cannot buffer'ize non-c contiguous array"); - - m_type.set(data); - - m_data = data; - m_ptr = reinterpret_cast<void*>(data->data()); - m_is_blitz = true; - } - - /** - * @brief This method will set my internal data to the value you - * specify. We will do this by copying the data you gave. - */ - template <typename T, int N> void set(const blitz::Array<T,N>& data) { - set(boost::make_shared<blitz::Array<T,N> >(bob::core::array::ccopy(data))); - } - - /** - * @brief This method will set my internal data to the value you specify. - * We will do this by referencing the data you gave. - * @warning Any resize of the given blitz::Array after this call leads to - * unexpected results - */ - template <typename T, int N> void set(blitz::Array<T,N>& data) { - set(boost::make_shared<blitz::Array<T,N> >(data)); - } - - /** - * @brief This method returns a reference to my internal data. It is the - * fastest way to get access to my data because it involves no data - * copying. This method has two limitations: - * - * 1) You need to know the correct type and number of dimensions or I'll - * throw an exception. - * - * 2) If this buffer was started by refering to another buffer's data - * which is not a blitz array, an exception will be raised. - * Unfortunately, blitz::Array<>'s do not offer a management mechanism - * for tracking external data allocation. The exception can be avoided - * and the referencing mechanism forced if you set the flag "temporary" - * to "true". In this mode, this method will always suceed, but the - * object returned will have its lifetime associated to this buffer. In - * other words, you should make sure this buffer outlives the returned - * blitz::Array<T,N>. - */ - template <typename T, int N> blitz::Array<T,N> get(bool temporary=false) { - - if (m_is_blitz) { - - if (!m_data) throw std::runtime_error("empty blitz array"); - - if (m_type.dtype != getElementType<T>()) { - boost::format m("cannot efficiently retrieve blitz::Array<%s,%d> from buffer of type '%s'"); - m % stringize<T>() % N % m_type.str(); - throw std::runtime_error(m.str()); - } - - if (m_type.nd != N) { - boost::format m("cannot retrieve blitz::Array<%s,%d> from buffer of type '%s'"); - m % stringize<T>() % N % m_type.str(); - throw std::runtime_error(m.str()); - } - - return *boost::static_pointer_cast<blitz::Array<T,N> >(m_data).get(); - } - - else { - - if (temporary) { //returns a temporary reference - return bob::io::base::array::wrap<T,N>(*this); - } - - else { - throw std::runtime_error("cannot get() external non-temporary non-blitz array buffer -- for a temporary object, set temporary=true; if you need the returned object to outlive this buffer; use copy() or cast()"); - } - } - - } - - /** - * @brief This method returns a copy to my internal data (not a - * reference) in the type you wish. It is the easiest method to use - * because I'll never throw, no matter which type you want to receive - * data at. Only get the number of dimensions right! - */ - template <typename T, int N> blitz::Array<T,N> cast() const { - return bob::io::base::array::cast<T,N>(*this); - } - - private: //representation - - typeinfo m_type; ///< type information - void* m_ptr; ///< pointer to the data - bool m_is_blitz; ///< true if initiated with a blitz::Array<> - boost::shared_ptr<void> m_data; ///< Pointer to the data owner - - }; - -}}}} - -#endif /* BOB_IO_BASE_BLITZ_ARRAY_H */ diff --git a/bob/io/base/include/bob.io.base/config.h b/bob/io/base/include/bob.io.base/config.h deleted file mode 100644 index cc07a9a..0000000 --- a/bob/io/base/include/bob.io.base/config.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Fri 1 Nov 07:10:59 2013 - * - * @brief General directives for all modules in bob.io - */ - -#ifndef BOB_IO_BASE_CONFIG_H -#define BOB_IO_BASE_CONFIG_H - -/* Macros that define versions and important names */ -#define BOB_IO_BASE_API_VERSION 0x0201 - - -#ifdef BOB_IMPORT_VERSION - - /*************************************** - * Here we define some functions that should be used to build version dictionaries in the version.cpp file - * There will be a compiler warning, when these functions are not used, so use them! - ***************************************/ - - #include <Python.h> - #include <boost/preprocessor/stringize.hpp> - #include <hdf5.h> - - /** - * The version of HDF5 - */ - static PyObject* hdf5_version() { - boost::format f("%s.%s.%s"); - f % BOOST_PP_STRINGIZE(H5_VERS_MAJOR); - f % BOOST_PP_STRINGIZE(H5_VERS_MINOR); - f % BOOST_PP_STRINGIZE(H5_VERS_RELEASE); - return Py_BuildValue("s", f.str().c_str()); - } - - /** - * bob.io.base c/c++ api version - */ - static PyObject* bob_io_base_version() { - return Py_BuildValue("{ss}", "api", BOOST_PP_STRINGIZE(BOB_IO_BASE_API_VERSION)); - } - -#endif // BOB_IMPORT_VERSION - - -#endif /* BOB_IO_BASE_CONFIG_H */ diff --git a/bob/io/base/include/bob.io.base/reorder.h b/bob/io/base/include/bob.io.base/reorder.h deleted file mode 100644 index 09ebf50..0000000 --- a/bob/io/base/include/bob.io.base/reorder.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @date Tue Nov 22 11:24:44 2011 +0100 - * @author Andre Anjos <andre.anjos@idiap.ch> - * - * @brief Row-major to column-major reordering and vice-versa - * - * Copyright (C) Idiap Research Institute, Martigny, Switzerland - */ - -#ifndef BOB_IO_BASE_REORDER_H -#define BOB_IO_BASE_REORDER_H - -#include <stdint.h> - -#include <bob.io.base/array.h> - -namespace bob { namespace io { namespace base { - - /** - * Returns, on the first argument, the linear indexes by calculating the - * linear positions relative to both row-major and column-major order - * matrixes given a certain index accessing a position in the matrix and the - * matrix shape - * - * @param row The resulting row-major linear index. - * (row,col) is a 2-tuple with the results: row-major and - * column-major linear indexes - * @param col The resulting column-major linear index. (see above) - * @param i Index of the column. - * (i,j) a 2-tuple with the indexes as would be accessed - * [col][row]; this is the same as accessing the matrix like - * on directions [y][x] - * @param j Index of the row. (see above) - * @param shape a 2-tuple with the matrix shape like [col][row]; this is the - * same as thinking about the extends of the matrix like on directions - * [y][x] - * - * Detailed arithmetics with graphics and explanations can be found here: - * http://webster.cs.ucr.edu/AoA/Windows/HTML/Arraysa2.html - */ - void rc2d(size_t& row, size_t& col, const size_t i, const size_t j, - const size_t* shape); - - /** - * Same as above, but for a 3D array organized as [depth][column][row] - */ - void rc3d(size_t& row, size_t& col, const size_t i, const size_t j, - const size_t k, const size_t* shape); - - /** - * Same as above, but for a 4D array organized as [time][depth][column][row] - */ - void rc4d(size_t& row, size_t& col, const size_t i, const size_t j, - const size_t k, const size_t l, const size_t* shape); - - /** - * Converts the data from row-major order (C-Style) to column major order - * (Fortran style). Input parameters are the src data in row-major order, the - * destination (pre-allocated) array of the same size and the type - * information. - */ - void row_to_col_order(const void* src_, void* dst_, const - bob::io::base::array::typeinfo& info); - - /** - * Converts the data from column-major order (Fortran-Style) to row major - * order (C style), which is required by bob. Input parameters are the src - * data in column-major order, the destination (pre-allocated) array of the - * same size and the type information. - */ - void col_to_row_order(const void* src_, void* dst_, - const bob::io::base::array::typeinfo& info); - - /** - * Converts the data from row-major order (C-Style) to column major order - * (Fortran style). Input parameters are the src data in row-major order, the - * destination (pre-allocated) array of the same size and the type - * information. - */ - void row_to_col_order_complex(const void* src_, void* dst_re_, - void* dst_im_, const bob::io::base::array::typeinfo& info); - - /** - * Converts the data from column-major order (Fortran-Style) to row major - * order (C style), which is required by bob. Input parameters are the src - * data in column-major order, the destination (pre-allocated) array of the - * same size and the type information. - */ - void col_to_row_order_complex(const void* src_re_, const void* src_im_, - void* dst_, const bob::io::base::array::typeinfo& info); - -}}} - -#endif /* BOB_IO_BASE_REORDER_H */ diff --git a/bob/io/base/include/bob.io.base/utils.h b/bob/io/base/include/bob.io.base/utils.h deleted file mode 100644 index c42b1fa..0000000 --- a/bob/io/base/include/bob.io.base/utils.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Wed 3 Oct 07:46:49 2012 - * - * @brief Utilities for easy manipulation of filed data. - */ - -#ifndef BOB_IO_BASE_BASE_UTILS_H -#define BOB_IO_BASE_BASE_UTILS_H - -#include <boost/shared_ptr.hpp> - -#include <bob.io.base/File.h> - -namespace bob { namespace io { namespace base { - - /** - * Creates a new array codec using the filename extension to determine which - * codec to use. The opening mode is passed to the underlying registered File - * implementation. - * - * Here are the meanings of the mode flag: - * - * 'r': opens for reading only - no modifications can occur; it is an - * error to open a file that does not exist for read-only operations. - * 'w': opens for reading and writing, but truncates the file if it - * exists; it is not an error to open files that do not exist with - * this flag. - * 'a': opens for reading and writing - any type of modification can - * occur. If the file does not exist, this flag is effectively like - * 'w'. - */ - boost::shared_ptr<File> open (const char* filename, char mode); - - /** - * Opens the file pretending it has a different extension (that is, using a - * different codec) then the one expected (if any). This allows you to write - * a file with the extension you want, but still using one of the available - * codecs. - */ - boost::shared_ptr<File> open (const char* filename, char mode, - const char* pretend_extension); - - /** - * Peeks the file and returns the typeinfo for reading individual frames (or - * samples) from the file. - * - * This method is equivalent to calling open() with 'r' as mode flag and then - * calling type() on the returned bob::io::base::File object. - */ - bob::io::base::array::typeinfo peek (const char* filename); - - /** - * Peeks the file and returns the typeinfo for reading the whole contents in - * a single shot. - * - * This method is equivalent to calling open() with 'r' as mode flag and then - * calling type_all() on the returned bob::io::base::File object. - */ - bob::io::base::array::typeinfo peek_all (const char* filename); - - /** - * Opens for reading and load all contents - * - * This method is equivalent to calling open() with 'r' as mode flag and then - * calling read_all() on the returned bob::io::base::File object. - */ - template <typename T, int N> blitz::Array<T,N> load (const char* filename) { - return open(filename, 'r')->read_all<T,N>(); - } - - /** - * Opens for reading and load a particular frame (or sample) - * - * This method is equivalent to calling open() with 'r' as mode flag and then - * calling read(index) on the returned bob::io::base::File object. - */ - template <typename T, int N> blitz::Array<T,N> load (const char* filename, size_t index) { - return open(filename, 'r')->read<T,N>(index); - } - - /** - * Opens for appending and add an array to it - * - * This method is equivalent to calling open() with 'a' as mode flag and then - * calling append(data) on the returned bob::io::base::File object. - */ - template <typename T, int N> void append (const char* filename, const blitz::Array<T,N>& data) { - open(filename, 'a')->append(data); - } - - /** - * Opens for writing and write an array to it. If the file exists before the - * call to this method, it is truncated. - * - * This method is equivalent to calling open() with 'w' as mode flag and then - * calling write(data) on the returned bob::io::base::File object. - */ - template <typename T, int N> void save (const char* filename, const blitz::Array<T,N>& data) { - open(filename, 'w')->write(data); - } - -}}} - -#endif /* BOB_IO_BASE_BASE_UTILS_H */ diff --git a/bob/io/base/main.cpp b/bob/io/base/main.cpp deleted file mode 100644 index 01a82d9..0000000 --- a/bob/io/base/main.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Fri 25 Oct 16:54:55 2013 - * - * @brief Bindings to bob::io - */ - -#define BOB_IO_BASE_MODULE -#include <bob.io.base/api.h> - -#ifdef NO_IMPORT_ARRAY -#undef NO_IMPORT_ARRAY -#endif -#include <bob.blitz/capi.h> -#include <bob.blitz/cleanup.h> -#include <bob.extension/documentation.h> - -extern bool init_File(PyObject* module); -extern bool init_HDF5File(PyObject* module); - -/** - * Creates an str object, from a C or C++ string. Returns a **new - * reference**. - */ -static PyObject* make_object(const char* s) { - return Py_BuildValue("s", s); -} - -static auto s_extensions = bob::extension::FunctionDoc( - "extensions", - "Returns a dictionary containing all extensions and descriptions currently stored on the global codec registry", - "The extensions are returned as a dictionary from the filename extension to a description of the data format." -) -.add_prototype("", "extensions") -.add_return("extensions", "{str : str}", "A dictionary of supported extensions"); -static PyObject* PyBobIo_Extensions(PyObject*) { -BOB_TRY - typedef std::map<std::string, std::string> map_type; - const map_type& table = bob::io::base::CodecRegistry::getExtensions(); - - PyObject* retval = PyDict_New(); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - for (auto it=table.begin(); it!=table.end(); ++it) { - PyObject* pyvalue = make_object(it->second.c_str()); - if (!pyvalue) return 0; - auto p_ = make_safe(pyvalue); - if (PyDict_SetItemString(retval, it->first.c_str(), pyvalue) != 0) { - return 0; - } - } - - return Py_BuildValue("O", retval); -BOB_CATCH_FUNCTION("extensions", 0); -} - -static PyMethodDef module_methods[] = { - { - s_extensions.name(), - (PyCFunction)PyBobIo_Extensions, - METH_NOARGS, - s_extensions.doc(), - }, - {0} /* Sentinel */ -}; - -PyDoc_STRVAR(module_docstr, "Core bob::io classes and methods"); - -int PyBobIo_APIVersion = BOB_IO_BASE_API_VERSION; - -#if PY_VERSION_HEX >= 0x03000000 -static PyModuleDef module_definition = { - PyModuleDef_HEAD_INIT, - BOB_EXT_MODULE_NAME, - module_docstr, - -1, - module_methods, - 0, 0, 0, 0 -}; -#endif - -static PyObject* create_module (void) { - -# if PY_VERSION_HEX >= 0x03000000 - PyObject* m = PyModule_Create(&module_definition); - auto m_ = make_xsafe(m); - const char* ret = "O"; -# else - PyObject* m = Py_InitModule3(BOB_EXT_MODULE_NAME, module_methods, module_docstr); - const char* ret = "N"; -# endif - if (!m) return 0; - - /* register some constants */ - if (!init_File(m)) return 0; - if (!init_HDF5File(m)) return 0; - - static void* PyBobIo_API[PyBobIo_API_pointers]; - - /* exhaustive list of C APIs */ - - /************** - * Versioning * - **************/ - - PyBobIo_API[PyBobIo_APIVersion_NUM] = (void *)&PyBobIo_APIVersion; - - /********************************** - * Bindings for bob.io.base.File * - **********************************/ - - PyBobIo_API[PyBobIoFile_Type_NUM] = (void *)&PyBobIoFile_Type; - - PyBobIo_API[PyBobIoFileIterator_Type_NUM] = (void *)&PyBobIoFileIterator_Type; - - /************************ - * I/O generic bindings * - ************************/ - - PyBobIo_API[PyBobIo_AsTypenum_NUM] = (void *)PyBobIo_AsTypenum; - - PyBobIo_API[PyBobIo_TypeInfoAsTuple_NUM] = (void *)PyBobIo_TypeInfoAsTuple; - - PyBobIo_API[PyBobIo_FilenameConverter_NUM] = (void *)PyBobIo_FilenameConverter; - - /***************** - * HDF5 bindings * - *****************/ - - PyBobIo_API[PyBobIoHDF5File_Type_NUM] = (void *)&PyBobIoHDF5File_Type; - - PyBobIo_API[PyBobIoHDF5File_Check_NUM] = (void *)&PyBobIoHDF5File_Check; - - PyBobIo_API[PyBobIoHDF5File_Converter_NUM] = (void *)&PyBobIoHDF5File_Converter; - -/***************************************** - * Code Registration and De-registration * - *****************************************/ - - PyBobIo_API[PyBobIoCodec_Register_NUM] = (void *)&PyBobIoCodec_Register; - - PyBobIo_API[PyBobIoCodec_Deregister_NUM] = (void *)&PyBobIoCodec_Deregister; - - PyBobIo_API[PyBobIoCodec_IsRegistered_NUM] = (void *)&PyBobIoCodec_IsRegistered; - - PyBobIo_API[PyBobIoCodec_GetDescription_NUM] = (void *)&PyBobIoCodec_GetDescription; - -#if PY_VERSION_HEX >= 0x02070000 - - /* defines the PyCapsule */ - - PyObject* c_api_object = PyCapsule_New((void *)PyBobIo_API, - BOB_EXT_MODULE_PREFIX "." BOB_EXT_MODULE_NAME "._C_API", 0); - -#else - - PyObject* c_api_object = PyCObject_FromVoidPtr((void *)PyBobIo_API, 0); - -#endif - - if (!c_api_object) return 0; - - if (PyModule_AddObject(m, "_C_API", c_api_object) < 0) return 0; - - /* imports dependencies */ - if (import_bob_blitz() < 0) return 0; - - return Py_BuildValue(ret, m); -} - -PyMODINIT_FUNC BOB_EXT_ENTRY_NAME (void) { -# if PY_VERSION_HEX >= 0x03000000 - return -# endif - create_module(); -} diff --git a/bob/io/base/test.cpp b/bob/io/base/test.cpp deleted file mode 100644 index 559535a..0000000 --- a/bob/io/base/test.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @author Manuel Gunther - * @date Tue Sep 13 13:01:31 MDT 2016 - * - * @brief Tests for bob::io::base - */ - -#include <bob.io.base/api.h> -#include <bob.blitz/cleanup.h> -#include <bob.extension/documentation.h> - -#include <boost/format.hpp> -#include <boost/filesystem.hpp> - -static auto s_test_api = bob::extension::FunctionDoc( - "_test_api", - "Some tests for API functions" -) -.add_prototype("tempdir") -.add_parameter("tempdir", "str", "A temporary directory to write data to") -; -static PyObject* _test_api(PyObject*, PyObject *args, PyObject* kwds){ -BOB_TRY - static char** kwlist = s_test_api.kwlist(); - - const char* tempdir; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &tempdir)) return 0; - - blitz::Array<uint8_t, 1> test_data(5); - for (int i = 0; i < 5; ++i){ - test_data(i) = i+1; - } - - auto h5file = bob::io::base::CodecRegistry::instance()->findByExtension(".hdf5"); - - boost::filesystem::path hdf5(tempdir); hdf5 /= std::string("test.h5"); - - auto output = h5file(hdf5.string().c_str(), 'w'); - output->write(test_data); - output.reset(); - - auto input = h5file(hdf5.string().c_str(), 'r'); - blitz::Array<uint8_t,1> read_data(input->read<uint8_t,1>(0)); - - // Does not compile at the moment - blitz::Array<uint16_t,1> read_data_2(input->cast<uint16_t,1>(0)); - - input.reset(); - - if (blitz::any(test_data - read_data)) - throw std::runtime_error("The HDF5 IO test did not succeed"); - - if (blitz::any(test_data - read_data_2)) - throw std::runtime_error("The HDF5 IO test did not succeed"); - - Py_RETURN_NONE; -BOB_CATCH_FUNCTION("_test_api", 0) -} - -static PyMethodDef module_methods[] = { - { - s_test_api.name(), - (PyCFunction)_test_api, - METH_VARARGS|METH_KEYWORDS, - s_test_api.doc(), - }, - {0} /* Sentinel */ -}; - -PyDoc_STRVAR(module_docstr, "Tests for bob::io::base"); - -#if PY_VERSION_HEX >= 0x03000000 -static PyModuleDef module_definition = { - PyModuleDef_HEAD_INIT, - BOB_EXT_MODULE_NAME, - module_docstr, - -1, - module_methods, - 0, 0, 0, 0 -}; -#endif - -static PyObject* create_module (void) { - -# if PY_VERSION_HEX >= 0x03000000 - PyObject* m = PyModule_Create(&module_definition); - auto m_ = make_xsafe(m); - const char* ret = "O"; -# else - PyObject* m = Py_InitModule3(BOB_EXT_MODULE_NAME, module_methods, module_docstr); - const char* ret = "N"; -# endif - if (!m) return 0; - - return Py_BuildValue(ret, m); -} - -PyMODINIT_FUNC BOB_EXT_ENTRY_NAME (void) { -# if PY_VERSION_HEX >= 0x03000000 - return -# endif - create_module(); -} diff --git a/bob/io/base/test/__init__.py b/bob/io/base/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bob/io/base/test/data/cmyk.jpg b/bob/io/base/test/data/cmyk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ed9423c9e19ec5e61298dc7dfb963e31f02a5b4 GIT binary patch literal 255 zcmex=<NpH&0WUXCHwH#VMg|WC4+e(+?-=+TQ}UBi8B!QP;Qws~X9i{_5CD<P%*@Oz zY%Cza!N$hQ#>v6O#mT|R$;HFZ!^O?V&B@6t$jiqsARs8f#UmsvBp}Q$ARzGn0D}kz z0~-Sii?bkuuOLIDAcMCc!~Y`;q700TAX^ZaljHvp23Y|HCMG6kBq?SVRyGDkCU#+= z|F;<USezMr86p|H85rytLOuo`_1BH^vCk6p4EXZ))XIpZisp*qg2D-F4NXE#X8zPV eaQ%t+<V&kECm23h_xI1yj~^WSCtMEye-i*QQa0@X literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/grace_hopper.png b/bob/io/base/test/data/grace_hopper.png new file mode 100644 index 0000000000000000000000000000000000000000..4a63320ab28dc6812e5eb89b1d7d50af0dbb0dcc GIT binary patch literal 628280 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	<Y3q%rUa_~GVGMuzP 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	(ZufMC3+zYSO&J_2KYYBnOSEO@|81AL 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	ANvE_5AyEjeyXCu94yVx6@L^002 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 literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/img_gray_alpha.png b/bob/io/base/test/data/img_gray_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..7643ce025d21ec8385a93836180167d3ce62167e GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZVAVPIh34hTEXz`($g?&#~tz_78O`%fY( z0|NtNage(c!@6@aFF~r4J%W507^>757#dm_7=AG@Ff_biU???UV0e|lz+g3lfkC`r z&aOZk1_lPEByV>YhX3vTXZABNFmM)lL>4nJa0`PlBg3pY5)2HCwVp1HAr_~nhS+*D zI||h9><H^>?Twfrahc`XhKm1(oYv^9`ODuF{wzL1(@ZRo<uBtm_U?5{0+N+FH53me z9?<7VFU%>+E1!J%WnS5{z2^Df)x?h%w8-Dsx#8KWGcy@hO*Li^FydBYT`;SD-|}=J z4z2??A3R=|+0?`EN8uq$!|BhxzGv5eHsRYA%ush=<^(UZ^jVS5GdWh4RCrnCUR-l{ z;o1kg9NE9c^l`6z@Tv0lsjSwjXNgHJf0yj7o1#`xEjx3^zV-aK%%iO{&2-~W+}wHf z=@I^@$w2`T#-b}KTc6~7kmGIm_3)_VS`W<&Yr2{@*KIM#|8;@KdtWdkYhd`TmkbA9 zZnUe;oLXZ$hxtI=zPHblLhE(KR+=a0Hy#q1_D0cN?#RZ!d@sCZ#65i@K5ydMEb{Ep zjk@msq}KneDr+XrfB9eP#QBu<o$LLl=guiScJs3C+X6k2b5h@@ZkiCen}K1OPhj1J z*G-|P7%sd%#2`@g$m{aP>ZG)HQQ_6=PQ{B}U)aA!W{EQc1A}UbYeY#(Vo9o1a#3nx zNh*VpfuWhMfw``cS%{&5m8pr9p`osUnU#UTPIuiV6b-rgDVb@NxHX)Rnrg?uz`)?? L>gTe~DWM4ffBO3! literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/img_indexed_color.png b/bob/io/base/test/data/img_indexed_color.png new file mode 100644 index 0000000000000000000000000000000000000000..c21427b328350a26155841013e461fa46e406be5 GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZVAW?*2L)}B|!z`)E9;1lBN=;rC{<>T%b z=ouUl8X4{B>*pPv5)qf^o0#L5UJ{sH8J(JynweEvS)Er<n4T16<Ko#<lRd2|dv;6i zw1)I4ZAEk13+Hr}OzEzf(^ogIzixJK&D4&v`4j4UTB{az7A@*7S=w8+q`PEUU**ES z>XrSKYx*lz^p-B3P`7GA_1a0bYbMofoKm--JwK$ZBeZsMd0kUP^Q_92j;QXXanrWM zOkA5Zdsq78)wzrJr7b&Izy3)5hU0acPStKXm$~jz?v`6M+b-5@zf!&9TGg&wm3!`0 z@4i#9?@`76Cxv^T73_GBH2*;PfoJ81UX~qxQ+niG@xj+shhLQ*{ZMx7W99LWbtgYo zpZM6--9DwSX;yzj@1&lo6I*9bXqq*tb?(IGsZ)DqPU)I8wR`T2zV6v`dZ$g9JZ;j{ znNudunLT^<^u7t53nw)$o7%c$a`Vb*ZEL1Bt)1DqdS=(M8J(M^HEx~Wv~_0d&RMN{ zX18ve*Sl#>_wIRJ%jZtov!HMD{0Vy&P1?R>`pQMKy5=pKG=D+w!liAC*K{vg-L_!) zq=idnEM3vMY;)(bjjb!Tb*<deyn0X9nq5=YZd<Wp`Hmgiw{BQ9d*Qr;^EwYN>^-@p z|H#tGr<P4Rw{q&K71PeFo^^EPtc$CrU0yT&+S*x{*3Q1Me)g@6bMI`Le{I9O`&$;? z*}UlbmZc}Ru6ek1(WC84o@`(GZ0E8^JC;A)wescem9O@!db4-+yZvil?Opp~*YX$p zH+(#>{?nliUk-2lc4YJSqg%cn-TLXswl@bipFF&$aoxe@^@p1`9BtZsx@+^X=ABok zZ9l$v|JltaE;gP1)OzMq``J$|XFheE``mN>bKix}Q!js+bm_~CD_>?^{W|a3*O^zo zbRU1d=*HJ&x4x~t`+e1&Zwsz}-FW}|_8Tv@Km4)l(T}~4f9!qoWB-#MTONF$eE8;x z6UT2{zkcE3g+ot&9)14v*o&X1Uj91w`q$}apD(`ob@}b@Ywvzvc=PMV``@=-f4=we z&#e!?FFk(!;`#H3pZ`4g^ykT!zpuaj`Tzg_zkmP!{{8#w*RQW%zrB0+{^q^=--_nw zGB7Z37I;J!Gca%qgD@k*tT_@43=Hfgp1!W^cRBdDI8}mro!>GrFkJF<aSYKoUpvW` z?~nmcYc2mWuQ{!~3&kCDVit-gG&V9DEZ{O!P?M0jcWUFVi@&bgt2Rv6sGJ`^=f)-1 zD{?ObHgPRTP<is$A>im`LDsgA1b1c^i2&!bGkX=Txcn)5rXQQP@H$6!`}Ot>7ozMN z!}o_Qt_x_W%&wMSs_pkoL#-$Kbdmhm8f(@!`~}~$(pU|YB3{<{-)4BTxNvrbU&Ee= zCKvw2fiIW*=KipF&We36bFQ8LP-ZMv7#{ziO?V<3Te`^Q3GVA8=UuH(@1FVQaIyZ& b54>~Yo7R+El;UJyU|{fc^>bP0l+XkKAtibj literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/img_indexed_color_alpha.png b/bob/io/base/test/data/img_indexed_color_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..defabb829d44bcd28b8939afbc64c1b3f9143342 GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZVAW?*2L)}B|!z`($g?&#~tz_78O`%fY( z0|NtNage(c!@6@aFF~r4J%W507^>757#dm_7=AG@Ff_biU???UV0e|lz+g3lfkC`r z&aOZk1_p+}0G|-o(xV@~AKh|h^{kHv)^{%3Sa$f$jrFs;HXmEsTQ+6wwpmlVA8uWA zZSAag``0e)tL|R1`pw?evwLf%PVH%3vF*wBr4{=gO`SRA&Zha>=Jnp+vhe@^{}&YI zcQG(9NR<Tn1($w5^Rct+M%U6QvmRc1x3K%o?5V9!DyH7qcE7Im+Y*r5lf2zsq)OAD z7%?y~a29w(7Bet#3xhBt!>l<H3=9lgJzX3_G|txsy_9M;;83=nV|~~5`EUCdS}Pmg zZu|3aG7E>8q)bxB$rDT~Odfqn3Yl>9l8V%^poF7r1wKrTX6dFe3w@6)+gz7h!Yr%& zh3_+a{=zu#gKDj2pQA+uc4yiLRm&VYc2oM|g?E8|b43z3&pmq<#JPzj{O`WX=<tjk z=c}g~+vIjnvr9kMzMtuzM(~#V6?WJBZxjpj&!5U;S1I@~;e%5t@5d*<3fJC?+qCN> z%j(+pC+t@70&AQXIyW;gFsPQeMwFx^mZVxG7o{eaq%s&87@FxCnClvug%}!GnVMJ` q8tNLDSs57Ybk}V{(U6;;l9^VCTf+&dsdfwu3=E#GelF{r5}E+@1mwX0 literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/img_rgba_color.png b/bob/io/base/test/data/img_rgba_color.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6d2a10a91f3c36cb64f94ca00e6b971109f259 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZVAV_;xd7&*^{fq{V~-O<;Pfnj4m_n$;o z1_lPk;vjb?hIQv;UV>C7dj$D1FjT2AFf_C<F#KX*U}$*3z))(y!0;-8fx&791A}<M zoLzx73=9lxN#5=*4F5rJ!QSPQ85kHi3p^r=85p>QL70(Y)*J~22F7=uE{-7{$Jd70 zdK`9;sLhnsYSNuHZI#EX1rM$TI*G9_Z(8hU^-^u_mdPn6mRWSpUeO)Q&VDd*g2d}< zjz{J@x?Win67Bfvzh!L3x!tETYXv;s?XG!W`@SgNPq{@vL+SmsDbI8z0<TWF(8RJ~ ziJ8p%drddD%$U%#V`9ylWea?=4j;Vpo6p>T0dwW{XR9YAz5FC>X?tevJoEULj)|hy z4kvGF>CQOuGBLtn@9K#$M@46~mmU^&VBV9m#c5m6+t<z~8&B_!zF)k!L%>=g_<Wc0 zLb3Q57TcRYlY5G|?43ka<oar!%sv{M$yjysui?70??QLp-mrd4)5kLnTa4y?74z{4 z-#($I^ueB*=6fO2uP82LPM^8bf&IqTtqF(PnxEd_c$L3C!oPP>!G`{)pLZFwUto+| znj>l^W3&ItMX}7Uoevi7-_ddTpkyh#i_;B13wg<J^R9axzw<pQe4YC_z1fo(rq;$) zu6n3se6lyRnn&;Fdf5q`o!d`W?^_X`(IT+u5_{d{k0GCRBrZPtbs+wLnBXF>CWUOH zdd8<;{_=+M%lvnJXL*48gFs#Fq+`<dCc9E|Ej;A&I4oP#mF{`I*j3d3uHsPi@w9V{ zG3*iMD{d{E9LnHOZu9Wy%NaakJ}y0LCd9mA;Madw_F&GZWY(8&S~eNqpC)<v{Gzr^ zMhpxLswJ)wB`Jv|saDBFsfi`23`Pcqrn&}}x&{^@29{Qa=2j+Vx&~%e1_nCkAD>0h dkei>9nO2EgL+qsJLIwr~22WQ%mvv4FO#nH}I(Ps8 literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/img_trns.png b/bob/io/base/test/data/img_trns.png new file mode 100644 index 0000000000000000000000000000000000000000..7c16aab16960149a4762610eb8c6827c0814600d GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU=ZVAW?*2L)}B|!z`($g?&#~tz_78O`%fY( z0|NtNage(c!@6@aFBupZ0t0+PTuYCB_;_IbolWyA_C30>e)iJdvZ*ttd_TJ7|NsBn z=Jnp+vhd0FrSJByy|#ANtf}1#`>JR6)=XKut#!q=?j@@qZe8?d@9L>jd%89sD?9w= z%<5U4%QhNpD|KaHVA$&E;uxZFzBcHkRI>p`@@&0br|(|>ZT~`RWy9NTe;!U|;ShT% zlhkqY1k(zWM_;l-CLBGaB6Te2!CAHfAErjLbkmrHzDJgA{+C(8EUWy5?=yS;!Z`1P z%B^Of)kOu`Gwp-I-yA-6Q~KhCcYbZ%A_<&%&z?naZel6_YgZi|o^j(`^)zFf-0o?1 z>F0LuXZoiRyybp{-8KIk#lqV2r}C_;6nvPl!KIY<<C9;7YwyKv+I5m;_1%^y>^`@- Wyc%--r5G3(7(8A5T-G@yGywpGTc+>; literal 0 HcmV?d00001 diff --git a/bob/io/base/data/matlab_1d.hdf5 b/bob/io/base/test/data/matlab_1d.hdf5 similarity index 100% rename from bob/io/base/data/matlab_1d.hdf5 rename to bob/io/base/test/data/matlab_1d.hdf5 diff --git a/bob/io/base/data/matlab_2d.hdf5 b/bob/io/base/test/data/matlab_2d.hdf5 similarity index 100% rename from bob/io/base/data/matlab_2d.hdf5 rename to bob/io/base/test/data/matlab_2d.hdf5 diff --git a/bob/io/base/test/data/test.gif b/bob/io/base/test/data/test.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c770fb7b60d43b03b89dc695425e811339963b3 GIT binary patch literal 151 zcmZ?wbhEHbWMN=q_`<{>Bqa3r@8AD0z`(!&V}fX`+<*W6!Nm;?4I$bYZ~(=hEMOTO h5DBuAfmK97fP*<uf_;((_hk!y5l`XJ$Z!q@YXG#XKHLBR literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/test.jpg b/bob/io/base/test/data/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bf2deb6a8f29793c1ae15a880aef370c43d01fc GIT binary patch literal 216 zcmex=<NpH&0WUXCHwH#VMg|WC4+e(+w;7xnn3+HTL^3loGqbR<fB**@8!H<p2NxG7 z2PY>N4?hnVHy<}AC$AtcAHRTrpa2(-kg$+|Fu#C+!2bgb+#C#S3@nU{f(-wUFo-ZP zGN1yE|3?^P1Q?i@m>H3zm|0la7@36Gh5p}S-~dV3Gvov=w2f?4ZGRkYH8*Zj%bk`G o7vHumXD)^uO1~Lq5}#l*Pc)dPv5)Kde#4p?f#e&RtN-5w00)UG;s5{u literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/test.pbm b/bob/io/base/test/data/test.pbm new file mode 100644 index 0000000..0902b22 --- /dev/null +++ b/bob/io/base/test/data/test.pbm @@ -0,0 +1,3 @@ +P4 +4 6 +�@ @ \ No newline at end of file diff --git a/bob/io/base/test/data/test.pgm b/bob/io/base/test/data/test.pgm new file mode 100644 index 0000000000000000000000000000000000000000..32cd7fae38dc8850cb7ce244908ba749eb364327 GIT binary patch literal 35 jcmWGA<uXw)<1#We<r4b)|Nno6{|MqA!~g$=fBypj7~m83 literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/test.ppm b/bob/io/base/test/data/test.ppm new file mode 100644 index 0000000000000000000000000000000000000000..a5baf843114a68f76cdc36e96658bfbcd782b3eb GIT binary patch literal 83 tcmWGA<1$e&<1#We<q{GS`uq3qe;8n3V1O|}G*<4vfB)d(hK7a^?Ep$YI8Oio literal 0 HcmV?d00001 diff --git a/bob/io/base/data/test1.hdf5 b/bob/io/base/test/data/test1.hdf5 similarity index 100% rename from bob/io/base/data/test1.hdf5 rename to bob/io/base/test/data/test1.hdf5 diff --git a/bob/io/base/data/test7_unlimited.hdf5 b/bob/io/base/test/data/test7_unlimited.hdf5 similarity index 100% rename from bob/io/base/data/test7_unlimited.hdf5 rename to bob/io/base/test/data/test7_unlimited.hdf5 diff --git a/bob/io/base/test/data/test_2.pgm b/bob/io/base/test/data/test_2.pgm new file mode 100644 index 0000000000000000000000000000000000000000..863c6e80fd1144a2612fd5cd1044476c21f096d1 GIT binary patch literal 61 rcmWGA<uXw)<1#ZfH8$lE68ii1KNv7DfT{og|D&@0{e$og4M8da@faqK literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/test_2.ppm b/bob/io/base/test/data/test_2.ppm new file mode 100644 index 0000000000000000000000000000000000000000..a285afec5845554bfff4f6845393cccccbff4b46 GIT binary patch literal 157 zcmWGA<1$e&<1#ZfH8$lE0)xL`@E-#(fB}XuQ~)f=0Oep%$g=;y09gd0+z<@Fmj8u_ F000hOZ$AJ4 literal 0 HcmV?d00001 diff --git a/bob/io/base/data/test_array_codec.txt b/bob/io/base/test/data/test_array_codec.txt similarity index 100% rename from bob/io/base/data/test_array_codec.txt rename to bob/io/base/test/data/test_array_codec.txt diff --git a/bob/io/base/test/data/test_corrupted.pbm b/bob/io/base/test/data/test_corrupted.pbm new file mode 100644 index 0000000..5d28f04 --- /dev/null +++ b/bob/io/base/test/data/test_corrupted.pbm @@ -0,0 +1,3 @@ +P4 +4 6 +�@ @a diff --git a/bob/io/base/test/data/test_corrupted.pgm b/bob/io/base/test/data/test_corrupted.pgm new file mode 100644 index 0000000000000000000000000000000000000000..8f34579e2f6c6710677b5689d15099638912a948 GIT binary patch literal 37 lcmWGA<uXw)<1#We<r4b)|Nno6{|MqA!~g$=fBz?P0RTam6kz}W literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/test_corrupted.ppm b/bob/io/base/test/data/test_corrupted.ppm new file mode 100644 index 0000000000000000000000000000000000000000..fa528857de00ad3392bee8a35be1e94e06ffa500 GIT binary patch literal 85 vcmWGA<1$e&<1#We<q{GS`uq3qe;8n3V1O|}G*<4vfB)d(hK7a^?TK6fyQw(3 literal 0 HcmV?d00001 diff --git a/bob/io/base/test/data/test_spaces.pgm b/bob/io/base/test/data/test_spaces.pgm new file mode 100644 index 0000000..e1d116b --- /dev/null +++ b/bob/io/base/test/data/test_spaces.pgm @@ -0,0 +1,6 @@ +P5 +# CREATOR: GIMP PNM Filter Version 1.1 + +100 100 +255 +[\[YXY\[^^]`]aaa`d_`ba_b`aad`ddage��jhilpkjsuqnkqquypmstqrk{wrtxuxttvvww{{zxz{{w{|}}���~��������XYYYZ[^_]\_[\^^]\baabb^bbfg`aggiii}��ooitt}�x~tq|xq�lpozupt�stzuu{uywxzyzxz}zz{{zz�}�|~����������X\Z]_[][\^__^^_`__a]f_ca_``\bee`dhw�ypp~�k��op��zw~wpu|�}vvwvwwvx|wy{{}y}|z~}}�}��~}�����~�����YZ[[\]][\]]\_]^```bc`_acbaaccbadwr{x��rx~|uy��~�|z���yqs|ux�}{yyy~vuxux{wy}zz{z{}}�}~�������������WZ\\[[Z_aZ^]^_a^]]_``a_cbccdcbfn`mvw|ggdgo{y�ot�������uw{v����{~x�v{yxzy}x||{{z}~�~~|���~��������Z]]X^`^\^]`_``a_`a_^cbbbbhaeabhlninoTAE>;_]lok^gtm����y����������vwzywxyz{zxwy~{|}y}�~�����������_[[[]]\```]]`a_]cbaa_`ccabdfbhlvxuqUA:9/36=CMRX_|wo~����^`�su{w���~�zzxz{|y{{||}}~~|��~����������XZ[\_]]``a[]_^\__`Zdaa__eddbdabfxv\;6@ADB:2<D@J\d�~�no�p}���������}�}}}xyyxz|��{}{|~~��������������^\[Y\\Z\\^^^`^^^^^b^baacccegbfqil[D;EA:S@PLNMOakXlrxlmvtlQa��zy��������Ëzyxy|z{{|�|~��|}}������X\\][^]]Z^]\``_`_aab`abbcaefdheqYSE:NF28:;:GIKLGlfY`lo]MM>eoexi�����������~y{||{~{||�}����~��������]`]Z\\`^^^]b_^a`aa]b`aaab`bccem^FJL?K4:QPdA;E[J@UJKWNehN]\Vgkns����ڲ�����z|{}z~||}}~��~��������YY^]^]\a`^_a^````^d_acbbfabdbfcYZ;9MKEPXu~f?]?YQl^G^>4>LK>QWSfjlz�����������zzz|~�|�|}���}��������\][][\\a\_`\^[a^_b`b^bdabbg`gbWRHE<>RQ_rr��rB<PfTQcNE=8=7:?SCPkbki���ǫ������z|}}{~{�~~����~�����]]^\[_^\_Z]_adac]`bc_c`hfbefgdROI;A7NN\hs���UK_UIKc@640-060<Vethgg{���ǻ����{xx}z�|z~��~}���|���[\\]]\Z^_^_^__a`\aa``^d`ddfggUAFZLI57LALkz{q^XhlbD:D7/5(3)-?<>YDa_qw������ȼ��y|{|~�||���~���~���\Y[\[Y`c_]\\_b^^]a``cccdgebg_I?CTZJG87B=Ubig^U\GO^P525F)/9::1B?^VhHgz������ҝ�~}{{{||�~�������Z\\\^b^\]a`b`da_a^_`bbebcbda^n_LMRLC<2+<MPXIDL@L`XV..8+0+I1"!9E33nuNWt�����ͷ��}z}{��|~}��}�������`\_^_\^]\Zcb`__`]`[j\bbadbg^VPZWHA<F;;/8>M@H;=BGF&6<>4**>(%35,87U�\SRf����ɹ����zz~}�~���~�������[\ZaaZ^a^c^cdc`b_bbedecdee`IJ@CC@FNE?94*%7D4;59B4.+$2 %2?,.86239=6EZhk�����|��}}~}}�|����������^\\a\[`^][b__bad[ad``geedgZFLNID@:?27601 09/NENCUWA=;(%%&8)6+),:0.?\DSfr���л����|{|{|~|�~�������]WZ]b`]]aa_ba`c_cbbdb_edf`IRHXD878.14($&0$./LIYOPVk_?/ 3C/"0/:<94Yea`ax����Ǒ����{}}z�}~{�}~~���][[Z^]]]]^_b\c_aa_d^_cffgUPPT=3/85-'#40)46411YVi^j{�s+(,334(252::Db�vp|~����ؙ��ë�~���{|����������]]\]^^`_ab`^`]`c__eebbdg`VHK323812/&%*975.+309AFVTX;=P05+'8-618CNCx~a������ù�����͇��|}~�����z����\[`_`_Y[Z\_a\`_a^cbjdf`cGLF@/129*10-**,363CG+/;177+"12%91%*99407kuf~�w~sw���������֣�����}}|~�����\^\]\^__b`__```dac`eadcRILB87398:*$/&(,1+/;5."2;/$%#5)-->( 306<6W�ivIRWjwl{������������}�~�~����\]]]]]_]`^b`_b_a]bc_c\PHCE:;.3,=4)/.,&!(5=BL4)+'0%$#+,.5@(8/75KGM�~aX\oY_JSl�������Ѷ���~}�|��~����Y\]_`^a[^a^\c^]c`afc_VHGH@A843=:,0*+&,.0&?J7;7)+.*,#/+3><66177?V^�t@Ll�JRIX`x�¦}��ͣ����|��~��~����\\Z[]a_[^]cb`abdaace`ME2E<?5<<;6:/2/*1440::G;7+$)3*)*+=580F:;ATV�]]g=<UBDDG^~������Ʈ�Ț�}~�~���~~�]]^]``]^]`ca^b]ab_d^ZQ0-B57/<0A?==9@F88;@?;/(.+710/1-4@9;HC?EDUR_hh@18AJGXZpq���������Ӗ���~���}����\_\_][^\a\[acb_bccaaP2&0=55C5<>9<I<.4;H:25,&&14,172.0J437%8?LU_MYyV5;7@XbL[viy�������������}������\`]^b^]_aa^_a^abdb_\V8:7101@35G:P>*:A=40.9%./<95750-9DAN4/<>0LeVCPS`P,J`lnqSTw���Ȥ���������{}}~~^]^_a]]cbb__]\^^`aa[QN9>&&,0,3IHL:/%-159345;5>B773.6IC4<=O246+_jFQPQfKZx�sjj�������������|�~~~��`]`bc]\^b`bbab^bea`VHH/1H%4,09?C<.2-26<8;""<GX>@;7<M?8>F78A>4:h?DMVNI^����n��������������~~~|�~~�[]^`a]^`aaa`bb_bb[ZKEK@+A61'*HFI2)7HE@>:,/*4DF:A=<7;K:DXhM?<<<3=B4?HRLRf}~�zx�������Ŵ��}{}~z}�|��~]\Z]aab``d_aa`]b^QM>=TG-@>/&4IBZ28;;FQ:'202HH>CIIB>7F@>DZtsaDK7_kC<D<TQ`kx�����������ʓ����}|�����\Y[^]`^`\_^bbb`a[C>F3O>7=92<7CKN7=;F?:=?:JF=FGCMNG?7L9FBRUmpry~�etfGJKs������d�������С��}z}�}|��|��^^^__b`]a_bdbceb`O@7.H;;@6;@G>PN-*+/8+$ -4DNQWSQLKD9M4EKTUYjrx�roo��_UU~�x�ci���s����հ�~}�~}}~��~[^]^`[[aacbc`bcbcO@4?;81=>,6O=JH6*-)4#'1FP\^caWSLRH9B4R_[W^[]}�|�ny��IYpw��r]t`~����ظ�}}~{{}}~�]a_^a_a```_^c_bf`AAK246$=4'.S>EI5-4+8-9GUiqmkgZWTPU?EJXZ_f_YHSGPl���lDg|��~ajvTi����ʢ�~~�||�~{�`^````b^_bdbb`bh`OMN263)0/''B24@D.-26@LZanqprkYVUW_HIRXQiaefWHNOihl���R]���suiJG\����ƚ��z�|}|}|��`^a^a^cb_]`c\_cfTVYT:@5%(6+340IN23;:GWahrovqo^S_]dNAJ]dijkkcL_S_\CYv��m���xaf7Sg����Н|���|x�z|{�}][`^]^c__aaccbbeNWV;[M5%$(0052?R67GCDQ\lqqosq\Y\ccSNGUfbowocRN[eGY|��}����xR[<.mk��ӵ�|�}}}|zy|�]a^_`]_^_c`cccdcH\RI=;4'+)-%:,78>=KUKNbioos|sfg[ec^cQTWncmzYjpinXX����~n�ukYEO+wo���Λ}�}�~�}}z�~`a`\a]c_`__aae`YMRE;=7?2-!,4:,&4JTJRTRVlvzw{ymkadoi_dY]asugTc_qkqI\�|VVt�v`B:F:^s���¦���~~~�~~�}�_aa_d__]_dbd`ceY@>D8:==10/%17% :9OTSVgkqy{y��qs�w\t`pq`\ZQVQkebjx�hNTZhpsGF79AT@u��ѱ�x|x|�||}��``_^dbf^aaibdca^6@?9QC"\tE 1;ELS_ijplry��xz�}uhcw�yJY_RVTss����eU{qtS?88GTE_��ѧ�}}y�|||}}||}]^_]b]_]^_b^cbejG9=@7!% )ZbiN?6&<?FFMhwvro~|}������y|���|_Qpslop�����ǖP:;9UbJS~�գ�zz|y|}~|~z}`^_^^``_`caaQPZVL52/$!,!#GOxsm`^P4?JRUQScvtyxz�������y�|��zW_u��ĸ����ۮ�\-:PMHXbo�ڕy~{yz}}|~~z~^a`a_aacbbbefQ:31--&))4' >qcJZdUJW^J^ic_[TR_kf}��������pon^K[b���̾�����ǔjQB4;\cWa�ԓ�|{{{}{{}z{~|}```_]`ffbbccefUB7-/8B>1%<�|iw{���~nZy�}zhjc`_o�}�������ysmz��l|�������ȸ�\:70:QaQW�ɓy{{||{}{{z}|}`]_^^aanle``]_d]OFWKI;!"$V�vWh���~|�x~}}ylnnpucv���������tmhgcvxp�������ɫmQK/;QfSi���|yz|||y}{|}||^]\_a`]adeeeebac]_YZJ(7X��b�������~������{}�wm~������sl����������������ƑYT.DKiL���~z{yyxz~}y|}]^_^_`aaabb]bbc`d_`K1(@Y��w��������������uhivru�����n����������������߽�woF6BNc^t��x�v{yyy{{}}{y}\\\aaaa_]ab`da`dcabK* .>d��v�}~�ztlnhkfZgnlZPuvy���s�������������������~��D8GM_i���|�uxzzxzz~xwxv[_]_^^_\^b``cbaa`b^?0@Ak��w�xvfn���y{usiSWMPlynq�����wfbdo{�������������9@AQic���|xz{u{wzzu{z{}x][\b__^_^]a_cbddfcb;&<L8k��s�{zx[Tml[XVONEU]Y`dw������xils{�����������ȍ��1F@Ws|w��xwyy{uu{{~xxys|^]^]aa]`]a^\dddecdi63JiBg��y����heQ<6;HIKPUhh}po���Ǔzd^RG=HWl���������r�8OIm}�~�yyxxvww~yuxxxzxx`[___b^a_cab``abddn@(<^n6^��{������wWPX^X]dagdrFn���Н�xfelmsx�����������]�^LU�����suvwuuxvz{x{wyvy\][[Z\_]_`^^_d^c`acK6CPc?n��~���������{�~{qio��N_����ž�~����������������U��Tl�����xvwvuvutwtwtzywy]\\\\_`[^^\``^`d`bkV=7NAAr��������������������wBx�����߾����������������ƽ[��S����~zwytvxwxvwywyxxvv`]^]^[^^^^_`ac^b^biMB??23�}��z����������������J[����Ǭ��IJ��������������ӥt��V��ij�zuvuvwuzxqrwvwvx{_]_[__`_^[_b__abbbi`LBA:.tv������������������jMs����ֶ���Ƽ�������������ےl�zX��Ӯ�|vusuxzwyyyswyuwx[]]]]_^_c``^a^_`bdagI>BH4hb�����������������{Jq�����������̸�������������}m��S�ͥ��twuwvuuwvtyyuwvuw[[[\^Z[_aa_ba^a_bd_deJHV7i������������������Vh��������������������������xpz�S��Ů�}vwwtsvwsvtwuuvwy[\[_]^_^a^_^`^`c`bdccWPJ=jav���|uz��������w`ey�������������ʽ����������宀u��Z��ͣ�~uxwuutuusvtutzuwY]^\_^][aab`eac`[_debh\K7Tmw����|oqnqvspi__oz{��������������Ƚ���������띆���^�����}wqrwxvsrruvxxwxuZ[_Z]][\\]]^^]`\cbachd`Z=KZs����~wxohvtrtx�|rms�������|���������������㪜���_�����yxqutsorrsrrtptvr\^[[ZZb]]^^`_bab^_]`ad_^MNGE��������������yWfq��������|q|�ɾ�����������ʳŴ���{}yrusrossssruusouwvxXXX]]^]``\^^bc`_bb_`bab^XA@=���������������qIr}��������n���������������ɯ��f��|rnrnonlrnsosqtrvpsvuZUa^[Y`_]]_]c\bacb_cc`ba_-83��������������~dQ{����������f|�������������俼��P�twqsrnpnmqorutrrqquvyu_][][W^_\^[b_a^][_`]bb_\Y,B/q������{������~bR����������ht�������������m�trmlorvponoonsntorsvsqtYZ]]Y\[]\\a__]^[`^daac_SI,F?U�������������wk]nkjv����ߣ��~��������������hm�|}pqonopmqprsqprptpqrsqqnYY\[_]]^\^]\_[^`a[^__b__UZ0\6������~�}���}zt[YHhouÝ}�����������������a�W��oppnnmlnoquoqqprssqsqtx]\\_^Y_\^[\a\^a`]^___^`_ag)`4�����|}����~yvsbb_m����������������������hgowrklmootornpopqpnotsqpsqrX]Z\\][[\X\\^_]\_a_a]d_`bbEWIs������z����{|w{v|��Ǿ������������������Srmmnlollnomprspnqrurqrqrso\Y[\YZ\Z^\]]\^]__^[[[ac``]_.[C�����|zx��������������ʿ����������������~ZtknkmllnolqmppqronsrqppoppuVX\Y[[UV\_\^b[]\^a^]_^``abd6^T������uy}����������������®�������������ljnmllmqnnomlnpmnomqprtqpporp]Y[[Y[^][[Y][]_Y[\]]^^^_\\`\&gl�����~xux~��~������������װ�������������MomkhmljpnnoloonnpopqmnpnqmomXWWZW[Z\_Y\][`YZ\[]c]^^_c^cbL8������yvy{�}�������������ο�֤��������Grlimjkjhihljjlllnooppqopmmpos[YXWX\X[ZZ\\\[\\\]]]\``__c_bd(l�������~������������������¶�������l\qkehigkkjklinlmmpoompplpnspmV[W[XYZ[\][[X]X]]Z]Z^]^]c_cb$��������~~t�s][_o����������̥���������Dk�rhkhkhkmjnlmommromnolminqsuX[YXYY\Y\\[^\[]W^][a\\_`cbS&"a�������|om[UN:))<HE@,3Ks������������Z<��hlffijhmijknnlhkknplmlkmmnmZZW\Y\[W\YX[^]`[^]a^]`c]cB$!)��������mkhNOLB-'.)1>Q���Ө���������R5u�VYspiiikhlllklmklknlllkkknmYW[`Z[YVX^\^ZX\Z]ZZZ][[eA!"# "2d����}yojlpfj[GMJDBBt���Ϯ�������� X]rNPa7_mpmjfhomplpnlhkkmlillkV[WXXZ]_[V[[[YZ^Y]\\__a=$# !3R{�}yxzumnppnkmdiejfd�����ë�������6inWeATgNBCOkjljjiknkojoonqmmkkoVXZZYWXTY[YZ\]^[Z\Z[bK,.<Wm}zwvwvswsmbhbjsvlgz�į���Ϫ�����+)Mg_>OYgFG?GdomjhjkimkhqllgmlolXZZWWV]ZXZ\ZZZ[[\aa`6(!"+;Sdouxstqnyxonhjmo�����������չ����F**J\2MXgOHADCMgmjikjjllmkmkjmmmWXW\XYZZYZ\\Z[\\[^G' "/:Qaqqnrtxw|zvsniiqs}~�������������B'%-JT2AZZEJIBC>>HcijijhiigjkjlmjYWZV[ZZWZ[YX[\Z^T4!):VZgrkiov}���}zokms~������������ϑ; (Ea/=NSL?BDC?A?DRdkmhmokkkkjilWYVWYZWYWXZY\`Z=&!+;:[]ormgou�}���}{w~����������������</I]1@FER9=FA>:@B@JYljeikkkjhjiUWV]XZZ\ZYZ\_E'!!-=6TXlkmunqy~��y�z}��������������y5! *>^7<?7N79=?>>;;;>BPjrmjiihkkjXWUW]XZZXX`B*""(:5MZgimoktqz��������������������ۙd) !+C_6::7I16898:73:8;BHexrllnhieXVSZX[Y_YE' %#&2:LSbehoojmwx|�w����������������χQ! #,JT4645C-2857316/273<IcoipphjfWVXW[^]@.& 3G>W]addhmkjru{{{��������������xP&"&.PV0730<+334210//03377?Xz`OdkkTWYXY4**!7C<QXfe``gihokosv{rqx�����ҷ���שcE.LT1.3.6.12//.+0.,.2/69;QgsdZkVY\>,.# 7D=LU[kb[hgcmncimpkho|vp�ɫ����N>%#2XT,,,42,*/-(+,,),/-3128>PWhyaXT4(#!2ABMRTcd_[_hfommjd_]gt��满���ƠiA4"(6ZJ0*(-0+,(,0&)/))+*+++68?IUftP.*! 4AF>YR]fjcb_dkqt�~zux���ޭ���Ӯ�U<)!&7\D0),/0.*+')*+%+(()(')/08=KXd+" !(AG;JTYfmlfc_am~�xmry}��ү��κ��O9';Y<+(/070*+%')++)%'(((**05=AKZ"# !>DF@TY^gnmhjefjxww{}���������tK< ,?O6)$+..1'')*&)'(''&'$'&,/9;AK diff --git a/bob/io/base/test/test_hdf5.py b/bob/io/base/test/test_hdf5.py new file mode 100644 index 0000000..437709f --- /dev/null +++ b/bob/io/base/test/test_hdf5.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : +# Tiago de Freitas Pereira <tiago.pereira@idiap.ch> +# +# Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland + +"""Tests for the base HDF5 infrastructure +""" + +import os +from bob.io.base import load, save +from .test_utils import temporary_filename + + +import numpy as np +import random + + +def read_write_check(data): + """Testing loading and save different file types""" + + tmpname = temporary_filename() + + try: + + save(data, tmpname) + data2 = load(tmpname) + finally: + os.unlink(tmpname) + + assert np.allclose(data, data2, atol=10e-5, rtol=10e-5) + + +def test_type_support(): + + # This test will go through all supported types for reading/writing data + # from to HDF5 files. One single file will hold all data for this test. + # This is also supported with HDF5: multiple variables in a single file. + + N = 100 + + data = [int(random.uniform(0, 100)) for z in range(N)] + + read_write_check(np.array(data, np.int8)) + read_write_check(np.array(data, np.uint8)) + read_write_check(np.array(data, np.int16)) + read_write_check(np.array(data, np.uint16)) + read_write_check(np.array(data, np.int32)) + read_write_check(np.array(data, np.uint32)) + read_write_check(np.array(data, np.int64)) + read_write_check(np.array(data, np.uint64)) + read_write_check(np.array(data, np.float32)) + read_write_check(np.array(data, np.float64)) + read_write_check(np.array(data, np.complex64)) + read_write_check(np.array(data, np.complex128)) diff --git a/bob/io/base/test/test_image_support.py b/bob/io/base/test/test_image_support.py new file mode 100644 index 0000000..4371699 --- /dev/null +++ b/bob/io/base/test/test_image_support.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : +# Laurent El Shafey <laurent.el-shafey@idiap.ch> +# Wed Aug 14 12:27:57 CEST 2013 +# +# Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland + +"""Runs some image tests +""" + +import os +import numpy + +from bob.io.base import load, write +from .test_utils import datafile, temporary_filename + +# import bob.io.image +import nose + + +# These are some global parameters for the test. +PNG_INDEXED_COLOR = datafile("img_indexed_color.png", __name__) +PNG_INDEXED_COLOR_ALPHA = datafile("img_indexed_color_alpha.png", __name__) +PNG_RGBA_COLOR = datafile("img_rgba_color.png", __name__) +PNG_GRAY_ALPHA = datafile("img_gray_alpha.png", __name__) +PNG_tRNS = datafile("img_trns.png", __name__) + + +def test_png_indexed_color(): + # Read an indexed color PNG image, and compared with hardcoded values + + img = load(PNG_INDEXED_COLOR) + assert img.shape == (3, 22, 32) + assert img[0, 0, 0] == 255 + assert img[0, 17, 17] == 117 + + +def test_png_rgba_color(): + # Read an indexed color PNG image, and compared with hardcoded values + img = load(PNG_RGBA_COLOR) + assert img.shape == (3, 22, 32) + assert img[0, 0, 0] == 255 + assert img[0, 17, 17] == 117 + + +def test_png_indexed_color_alpha(): + # Read an indexed color+alpha PNG image, and compared with hardcoded values + img = load(PNG_INDEXED_COLOR_ALPHA) + assert img.shape == (3, 22, 32) + assert img[0, 0, 0] == 255 + assert img[0, 17, 17] == 117 + + +def test_png_indexed_trns(): + # Read an tRNS PNG image (without alpha), and compared with hardcoded values + img = load(PNG_tRNS) + assert img.shape == (3, 22, 32) + assert img[0, 0, 0] == 255 + assert img[0, 17, 17] == 117 + + +def test_png_gray_alpha(): + # Read a gray+alpha PNG image, and compared with hardcoded values + + img = load(PNG_GRAY_ALPHA) + + assert img.shape == (22, 32) + assert img[0, 0] == 255 + assert img[17, 17] == 51 + + +def transcode(filename): + + tmpname = temporary_filename(suffix=os.path.splitext(filename)[1]) + tmpnam_ = temporary_filename(suffix=os.path.splitext(filename)[1]) + + try: + # complete transcoding test + image = load(filename) + + # save with the same extension + write(image, tmpname) + + # reload the image from the file + image2 = load(tmpname) + + assert numpy.array_equal(image, image2) + + # test getting part of the image as well + if len(image.shape) == 3: + subsample = image[:, ::2, ::2] + else: + subsample = image[::2, ::2] + + assert not subsample.flags.contiguous + write(subsample, tmpnam_) + image3 = load(tmpnam_) + assert numpy.array_equal(subsample, image3) + + finally: + if os.path.exists(tmpname): + os.unlink(tmpname) + if os.path.exists(tmpnam_): + os.unlink(tmpnam_) + + +def test_netpbm(): + + transcode(datafile("test.pbm", __name__)) # indexed, works fine + transcode(datafile("test.pgm", __name__)) # indexed, works fine + transcode(datafile("test.ppm", __name__)) # indexed, works fine + transcode(datafile("test_2.pgm", __name__)) # indexed, works fine + # transcode(datafile("test_2.ppm", __name__)) # indexed, works fine ----> THIS DOES NOT WORK + transcode(datafile("test_spaces.pgm", __name__)) # indexed, works fine + + # transcode(datafile("test.jpg", __name__)) # does not work + # because of re-compression + + +def notest_gif(): + transcode(datafile("test.gif", __name__)) + + +def test_image_load(): + # test that the generic bob.io.image.load function works as expected + for filename in ( + "test.jpg", + "cmyk.jpg", + "test.pbm", + "test_corrupted.pbm", + "test.pgm", + "test_corrupted.pgm", + "test.ppm", + "test_corrupted.ppm", + "test.gif", + ): + + full_file = datafile(filename, __name__) + + # load with just image name + i1 = load(full_file) + + assert i1.shape == (6, 4) + + # Loading the last pgm file + full_file = datafile("test_spaces.pgm", __name__) + load(full_file).shape == (100, 100) + + # Testing exception + nose.tools.assert_raises( + RuntimeError, lambda x: load(os.path.splitext(x)[0] + ".unknown"), full_file + ) diff --git a/bob/io/base/test/test_io.py b/bob/io/base/test/test_io.py new file mode 100644 index 0000000..7a31cda --- /dev/null +++ b/bob/io/base/test/test_io.py @@ -0,0 +1,96 @@ +import nose +import numpy as np +import os +from bob.io.base import vstack_features, save, load +from .test_utils import temporary_filename + + +def test_io_vstack(): + + paths = [1, 2, 3, 4, 5] + + def oracle(reader, paths): + return np.vstack([reader(p) for p in paths]) + + def reader_same_size_C(path): + return np.arange(10).reshape(5, 2) + + def reader_different_size_C(path): + return np.arange(2 * path).reshape(path, 2) + + def reader_same_size_F(path): + return np.asfortranarray(np.arange(10).reshape(5, 2)) + + def reader_different_size_F(path): + return np.asfortranarray(np.arange(2 * path).reshape(path, 2)) + + def reader_same_size_C2(path): + return np.arange(30).reshape(5, 2, 3) + + def reader_different_size_C2(path): + return np.arange(6 * path).reshape(path, 2, 3) + + def reader_same_size_F2(path): + return np.asfortranarray(np.arange(30).reshape(5, 2, 3)) + + def reader_different_size_F2(path): + return np.asfortranarray(np.arange(6 * path).reshape(path, 2, 3)) + + def reader_wrong_size(path): + return np.arange(2 * path).reshape(2, path) + + # when same_size is False + for reader in [ + reader_different_size_C, + reader_different_size_F, + reader_same_size_C, + reader_same_size_F, + reader_different_size_C2, + reader_different_size_F2, + reader_same_size_C2, + reader_same_size_F2, + ]: + np.all(vstack_features(reader, paths) == oracle(reader, paths)) + + # when same_size is True + for reader in [ + reader_same_size_C, + reader_same_size_F, + reader_same_size_C2, + reader_same_size_F2, + ]: + np.all(vstack_features(reader, paths, True) == oracle(reader, paths)) + + with nose.tools.assert_raises(AssertionError): + vstack_features(reader_wrong_size, paths) + + # test actual files + paths = [temporary_filename(), temporary_filename(), temporary_filename()] + try: + # try different readers: + for reader in [ + reader_different_size_C, + reader_different_size_F, + reader_same_size_C, + reader_same_size_F, + reader_different_size_C2, + reader_different_size_F2, + reader_same_size_C2, + reader_same_size_F2, + ]: + # save some data in files + for i, path in enumerate(paths): + save(reader(i + 1), path) + # test when all data is present + reference = oracle(load, paths) + np.all(vstack_features(load, paths) == reference) + os.remove(paths[0]) + # Check if RuntimeError is raised when one of the files is missing + with nose.tools.assert_raises(RuntimeError): + vstack_features(load, paths) + finally: + try: + for path in paths: + os.remove(path) + except Exception: + pass diff --git a/bob/io/base/test_utils.py b/bob/io/base/test/test_utils.py similarity index 100% rename from bob/io/base/test_utils.py rename to bob/io/base/test/test_utils.py diff --git a/bob/io/base/test_cpp.py b/bob/io/base/test_cpp.py deleted file mode 100644 index a9f4e06..0000000 --- a/bob/io/base/test_cpp.py +++ /dev/null @@ -1,11 +0,0 @@ -from bob.io.base._test import _test_api - -import tempfile -import shutil - -def test_api(): - temp_dir = tempfile.mkdtemp() - try: - _test_api(temp_dir) - finally: - shutil.rmtree(temp_dir) diff --git a/bob/io/base/test_file.py b/bob/io/base/test_file.py deleted file mode 100644 index 12b2485..0000000 --- a/bob/io/base/test_file.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env python -# vim: set fileencoding=utf-8 : -# Andre Anjos <andre.anjos@idiap.ch> -# Wed Nov 16 13:27:15 2011 +0100 -# -# Copyright (C) 2011-2013 Idiap Research Institute, Martigny, Switzerland - -"""A combined test for all built-in types of Array/interaction in -python. -""" - -import os -import sys -import numpy -import nose.tools - -from . import load, write, peek, peek_all, File, test_utils - -def test_peek(): - - f = test_utils.datafile('test1.hdf5', __name__) - assert peek(f) == (numpy.uint16, (3,), (1,)) - assert peek_all(f) == (numpy.uint16, (3,3), (3,1)) - -def test_iteration(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - nose.tools.eq_(len(f), 512) - - objs = load(fname) - - for l, i in zip(objs, f): - assert numpy.allclose(l, i) - -def test_indexing(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - nose.tools.eq_(len(f), 512) - - objs = load(fname) - nose.tools.eq_(len(f), len(objs)) - - # simple indexing - assert numpy.allclose(f[0], objs[0]) - assert numpy.allclose(f[1], objs[1]) - assert numpy.allclose(f[-1], objs[-1]) - assert numpy.allclose(f[-2], objs[-2]) - -def test_slicing_empty(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - - objs = f[1:1] - assert objs.shape == tuple() - -def test_slicing_0(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - - objs = f[:] - for i, k in enumerate(load(fname)): - assert numpy.allclose(k, objs[i]) - -def test_slicing_1(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - - # get slice - s1 = f[3:10:2] - nose.tools.eq_(len(s1), 4) - assert numpy.allclose(s1[0], f[3]) - assert numpy.allclose(s1[1], f[5]) - assert numpy.allclose(s1[2], f[7]) - assert numpy.allclose(s1[3], f[9]) - -def test_slicing_2(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - - # get negative slicing - s = f[-10:-2:3] - nose.tools.eq_(len(s), 3) - assert numpy.allclose(s[0], f[len(f)-10]) - assert numpy.allclose(s[1], f[len(f)-7]) - assert numpy.allclose(s[2], f[len(f)-4]) - -def test_slicing_3(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - - # get negative stepping slice - s = f[20:10:-3] - nose.tools.eq_(len(s), 4) - assert numpy.allclose(s[0], f[20]) - assert numpy.allclose(s[1], f[17]) - assert numpy.allclose(s[2], f[14]) - assert numpy.allclose(s[3], f[11]) - -def test_slicing_4(): - - fname = test_utils.datafile('matlab_2d.hdf5', __name__) - f = File(fname, 'r') - - # get all negative slice - s = f[-10:-20:-3] - nose.tools.eq_(len(s), 4) - assert numpy.allclose(s[0], f[len(f)-10]) - assert numpy.allclose(s[1], f[len(f)-13]) - assert numpy.allclose(s[2], f[len(f)-16]) - assert numpy.allclose(s[3], f[len(f)-19]) - -@nose.tools.raises(TypeError) -def test_indexing_type_check(): - - f = File(test_utils.datafile('matlab_2d.hdf5', __name__), 'r') - nose.tools.eq_(len(f), 512) - f[4.5] - -@nose.tools.raises(IndexError) -def test_indexing_boundaries(): - - f = File(test_utils.datafile('matlab_2d.hdf5', __name__), 'r') - nose.tools.eq_(len(f), 512) - f[512] - -@nose.tools.raises(IndexError) -def test_indexing_negative_boundaries(): - f = File(test_utils.datafile('matlab_2d.hdf5', __name__), 'r') - nose.tools.eq_(len(f), 512) - f[-513] - -def transcode(filename): - """Runs a complete transcoding test, to and from the binary format.""" - - tmpname = test_utils.temporary_filename(suffix=os.path.splitext(filename)[1]) - - try: - # transcode from test format into the test format -- test array access modes - orig_data = load(filename) - write(orig_data, tmpname) - rewritten_data = load(tmpname) - - assert numpy.array_equal(orig_data, rewritten_data) - - # transcode to test format -- test arrayset access modes - trans_file = File(tmpname, 'w') - index = [slice(orig_data.shape[k]) for k in range(len(orig_data.shape))] - for k in range(orig_data.shape[0]): - index[0] = k - trans_file.append(orig_data[index]) #slice from first dimension - del trans_file - - rewritten_file = File(tmpname, 'r') - - for k in range(orig_data.shape[0]): - rewritten_data = rewritten_file.read(k) - index[0] = k - assert numpy.array_equal(orig_data[index], rewritten_data) - - finally: - # And we erase both files after this - if os.path.exists(tmpname): os.unlink(tmpname) - -def array_readwrite(extension, arr, close=False): - """Runs a read/write verify step using the given numpy data""" - tmpname = test_utils.temporary_filename(suffix=extension) - try: - write(arr, tmpname) - reloaded = load(tmpname) - if close: assert numpy.allclose(arr, reloaded) - else: assert numpy.array_equal(arr, reloaded) - finally: - if os.path.exists(tmpname): os.unlink(tmpname) - -def arrayset_readwrite(extension, arrays, close=False): - """Runs a read/write verify step using the given numpy data""" - tmpname = test_utils.temporary_filename(suffix=extension) - try: - f = File(tmpname, 'w') - for k in arrays: - f.append(k) - del f - f = File(tmpname, 'r') - for k, array in enumerate(arrays): - reloaded = f.read(k) #read the contents - if close: - assert numpy.allclose(array, reloaded) - else: assert numpy.array_equal(array, reloaded) - finally: - if os.path.exists(tmpname): os.unlink(tmpname) - -def test_hdf5(): - - # array writing tests - a1 = numpy.random.normal(size=(2,3)).astype('float32') - a2 = numpy.random.normal(size=(2,3,4)).astype('float64') - a3 = numpy.random.normal(size=(2,3,4,5)).astype('complex128') - a4 = (10 * numpy.random.normal(size=(3,3))).astype('uint64') - - array_readwrite('.hdf5', a1) # extensions: .hdf5 or .h5 - array_readwrite(".h5", a2) - array_readwrite('.h5', a3) - array_readwrite(".h5", a4) - array_readwrite('.h5', a3[:,::2,::2,::2]) #test non-contiguous - - # arrayset writing tests - a1 = [] - a2 = [] - a3 = [] - a4 = [] - for k in range(10): - a1.append(numpy.random.normal(size=(2,3)).astype('float32')) - a2.append(numpy.random.normal(size=(2,3,4)).astype('float64')) - a3.append(numpy.random.normal(size=(2,3,4,5)).astype('complex128')) - a4.append((10*numpy.random.normal(size=(3,3))).astype('uint64')) - - arrayset_readwrite('.h5', a1) - arrayset_readwrite(".h5", a2) - arrayset_readwrite('.h5', a3) - arrayset_readwrite(".h5", a4) - - # complete transcoding tests - transcode(test_utils.datafile('test1.hdf5', __name__)) - transcode(test_utils.datafile('matlab_1d.hdf5', __name__)) - transcode(test_utils.datafile('matlab_2d.hdf5', __name__)) diff --git a/bob/io/base/test_hdf5.py b/bob/io/base/test_hdf5.py deleted file mode 100644 index a1ed619..0000000 --- a/bob/io/base/test_hdf5.py +++ /dev/null @@ -1,546 +0,0 @@ -#!/usr/bin/env python -# vim: set fileencoding=utf-8 : -# Andre Anjos <andre.anjos@idiap.ch> -# Wed Jun 22 17:50:08 2011 +0200 -# -# Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland - -"""Tests for the base HDF5 infrastructure -""" - -import os -import sys -import numpy -import random -import nose.tools - -from . import HDF5File, load, save, peek_all, test_utils - -def read_write_check(outfile, dname, data, dtype=None): - """Tests scalar input/output on HDF5 files""" - - if dtype is not None: data = [dtype(k) for k in data] - - # First, we test that we can read and write 1 single element - outfile.append(dname + '_single', data[0]) - - # Set attributes on the dataset and current path (single scalar) - outfile.set_attribute(dname + '_single_attr', data[0], dname + '_single') - outfile.set_attribute(dname + '_single_attr', data[0]) - - # Makes sure we can read the value out - assert numpy.array_equal(outfile.lread(dname + '_single', 0), data[0]) - - # Makes sure we can read the attributes out - assert numpy.array_equal(outfile.get_attribute(dname + '_single_attr', dname + '_single'), data[0]) - assert numpy.array_equal(outfile.get_attribute(dname + '_single_attr'), data[0]) - - # Now we go for the full set - outfile.append(dname, data) - - # Also create big attributes to see if that works - outfile.set_attribute(dname + '_attr', data, dname + '_single') - outfile.set_attribute(dname + '_attr', data) - - # And that we can read it back - back = outfile.lread(dname) #we read all at once as it is simpler - for i, b in enumerate(back): assert numpy.array_equal(b, data[i]) - - # Check the attributes - assert numpy.array_equal(outfile.get_attribute(dname + '_attr', dname + '_single'), data) - assert numpy.array_equal(outfile.get_attribute(dname + '_attr'), data) - -def read_write_array_check(outfile, dtype): - N = 10 - SHAPE = (2, 3, 4, 2) #48 elements in arrays - arrays = [] - for k in range(N): - data = [random.uniform(0,N) for z in range(numpy.product(SHAPE))] - nparray = numpy.array(data, dtype=dtype).reshape(SHAPE) - arrays.append(nparray) - read_write_check(outfile, dtype.__name__ + '_array', arrays) - -def read_write_subarray_check(outfile, dtype): - N = 10 - SHAPE = (2, 3, 4, 2) #48 elements in arrays - arrays = [] - for k in range(N): - data = [random.uniform(0,N) for z in range(numpy.product(SHAPE))] - nparray = numpy.array(data, dtype=dtype).reshape(SHAPE) - usearray = nparray[:,1,1:2,:] - assert not usearray.flags.contiguous - arrays.append(usearray) - read_write_check(outfile, dtype.__name__ + '_subarray', arrays) - -def test_can_create(): - - # This test demonstrates how to create HDF5 files from scratch, - # starting from blitz::Arrays - - try: - - # We start by creating some arrays to play with. Please note that in - # normal cases you are either generating these arrays or reading from - # other binary files or datasets. - N = 2 - SHAPE = (3, 2) #6 elements - NELEMENT = SHAPE[0] * SHAPE[1] - arrays = [] - for k in range(N): - data = [int(random.uniform(0,10)) for z in range(NELEMENT)] - arrays.append(numpy.array(data, 'int32').reshape(SHAPE)) - - # Now we create a new binary output file in a temporary location and save - # the data there. - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - outfile.append('testdata', arrays) - - # Data that is thrown in the file is immediately accessible, so you can - # interleave read and write operations without any problems. - # There is a single variable in the file, which is a bob arrayset: - nose.tools.eq_(outfile.paths(), ['/testdata']) - - # And all the data is *exactly* the same recorded, bit by bit - back = outfile.lread('testdata') # this is how to read the whole data back - for i, b in enumerate(back): - assert numpy.array_equal(b, arrays[i]) - - # If you want to immediately close the HDF5 file, just delete the object - del outfile - - # You can open the file in read-only mode using the 'r' flag. Writing - # operations on this file will fail. - readonly = HDF5File(tmpname, 'r') - - # There is a single variable in the file, which is a bob arrayset: - nose.tools.eq_(readonly.paths(), ['/testdata']) - - # You can get an overview of what is in the HDF5 dataset using the - # describe() method - description = readonly.describe('testdata') - - nose.tools.eq_(description[0][0][0], arrays[0].dtype) - nose.tools.eq_(description[0][0][1], arrays[0].shape) - nose.tools.eq_(description[0][1], N) #number of elements - nose.tools.eq_(description[0][2], True) #expandable - - # Test that writing will really fail - nose.tools.assert_raises(RuntimeError, readonly.append, "testdata", arrays[0]) - - - # And all the data is *exactly* the same recorded, bit by bit - back = readonly.lread('testdata') # how to read the whole data back - for i, b in enumerate(back): - assert numpy.array_equal(b, arrays[i]) - - finally: - os.unlink(tmpname) - -def test_type_support(): - - # This test will go through all supported types for reading/writing data - # from to HDF5 files. One single file will hold all data for this test. - # This is also supported with HDF5: multiple variables in a single file. - - try: - - N = 100 - - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - - data = [bool(int(random.uniform(0,2))) for z in range(N)] - read_write_check(outfile, 'bool_data', data) - data = [int(random.uniform(0,100)) for z in range(N)] - read_write_check(outfile, 'int_data', data) - read_write_check(outfile, 'int8_data', data, numpy.int8) - read_write_check(outfile, 'uint8_data', data, numpy.uint8) - read_write_check(outfile, 'int16_data', data, numpy.int16) - read_write_check(outfile, 'uint16_data', data, numpy.uint16) - read_write_check(outfile, 'int32_data', data, numpy.int32) - read_write_check(outfile, 'uint32_data', data, numpy.uint32) - - if sys.version_info[0] < 3: - data = [long(random.uniform(0,1000000000)) for z in range(N)] - else: - data = [int(random.uniform(0,1000000000)) for z in range(N)] - read_write_check(outfile, 'long_data', data) - read_write_check(outfile, 'int64_data', data, numpy.int64) - read_write_check(outfile, 'uint64_data', data, numpy.uint64) - - data = [float(random.uniform(0,1)) for z in range(N)] - read_write_check(outfile, 'float_data', data, float) - #Note that because of double => float precision issues, the next test will - #fail. Python floats are actually double precision. - #read_write_check(outfile, 'float32_data', data, numpy.float32) - read_write_check(outfile, 'float64_data', data, numpy.float64) - #The next construction is not supported by bob - #read_write_check(outfile, 'float128_data', data, numpy.float128) - - data = [complex(random.uniform(0,1),random.uniform(-1,0)) for z in range(N)] - read_write_check(outfile, 'complex_data', data, complex) - #Note that because of double => float precision issues, the next test will - #fail. Python floats are actually double precision. - #read_write_check(outfile, 'complex64_data', data, numpy.complex64) - read_write_check(outfile, 'complex128_data', data, numpy.complex128) - #The next construction is not supported by bob - #read_write_check(outfile, 'complex256_data', data, numpy.complex256) - - read_write_array_check(outfile, numpy.int8) - read_write_array_check(outfile, numpy.int16) - read_write_array_check(outfile, numpy.int32) - read_write_array_check(outfile, numpy.int64) - read_write_array_check(outfile, numpy.uint8) - read_write_array_check(outfile, numpy.uint16) - read_write_array_check(outfile, numpy.uint32) - read_write_array_check(outfile, numpy.uint64) - read_write_array_check(outfile, numpy.float32) - read_write_array_check(outfile, numpy.float64) - #read_write_array_check(outfile, numpy.float128) #no numpy conversion - read_write_array_check(outfile, numpy.complex64) - read_write_array_check(outfile, numpy.complex128) - #read_write_array_check(outfile, numpy.complex256) #no numpy conversion - - read_write_subarray_check(outfile, numpy.int8) - read_write_subarray_check(outfile, numpy.int16) - read_write_subarray_check(outfile, numpy.int32) - read_write_subarray_check(outfile, numpy.int64) - read_write_subarray_check(outfile, numpy.uint8) - read_write_subarray_check(outfile, numpy.uint16) - read_write_subarray_check(outfile, numpy.uint32) - read_write_subarray_check(outfile, numpy.uint64) - read_write_subarray_check(outfile, numpy.float32) - read_write_subarray_check(outfile, numpy.float64) - #read_write_subarray_check(outfile, numpy.float128) #no numpy conversion - read_write_subarray_check(outfile, numpy.complex64) - read_write_subarray_check(outfile, numpy.complex128) - #read_write_subarray_check(outfile, numpy.complex256) #no numpy conversion - - finally: - os.unlink(tmpname) - -def test_dataset_management(): - - try: - - # This test examplifies dataset management within HDF5 files and how to - # copy, delete and move data around. - - # Let's just create some dummy data to play with - N = 100 - - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - - data = [int(random.uniform(0,N)) for z in range(N)] - outfile.append('int_data', data) - - # This is how to rename a dataset. - outfile.rename('int_data', 'MyRenamedDataset') - - # You can move the Dataset to any other hierarchy in the HDF5 file. The - # directory structure within the file (i.e. the HDF5 groups) will be - # created on demand. - outfile.rename('MyRenamedDataset', 'NewDirectory1/Dir2/MyDataset') - - # Let's move the MyDataset dataset to another directory - outfile.rename('NewDirectory1/Dir2/MyDataset', 'Test2/Bla') - - # So, now the original dataset name does not exist anymore - nose.tools.eq_(outfile.paths(), ['/Test2/Bla']) - - # We can also unlink the dataset from the file. Please note this will not - # erase the data in the file, just make it inaccessible - outfile.unlink('Test2/Bla') - - # Finally, nothing is there anymore - nose.tools.eq_(outfile.paths(), []) - - finally: - os.unlink(tmpname) - -def test_resize_and_preserve(): - - # This test checks that non-contiguous C-style array can be saved - # into an HDF5 file. - - try: - # Let's just create some dummy data to play with - SHAPE = (2, 3) #6 elements - NELEMENT = SHAPE[0] * SHAPE[1] - data = [int(random.uniform(0,10)) for z in range(NELEMENT)] - array = numpy.array(data, 'int32').reshape(SHAPE) - - # Try to save a slice - tmpname = test_utils.temporary_filename() - save(array[:,0], tmpname) - - finally: - os.unlink(tmpname) - -def test_can_load_hdf5_from_matlab(): - - # shows we can load a 2D matlab array and interpret it as a bunch of 1D - # arrays, correctly - - t = load(test_utils.datafile('matlab_1d.hdf5', __name__)) - nose.tools.eq_(t.shape, (512,)) - nose.tools.eq_(t.dtype, numpy.float64) - - t = load(test_utils.datafile('matlab_2d.hdf5', __name__)) - nose.tools.eq_(t.shape, (512, 2)) - nose.tools.eq_(t.dtype, numpy.float64) - - # interestingly enough, if you load those files as arrays, you will read - # the whole data at once: - - dtype, shape, stride = peek_all(test_utils.datafile('matlab_1d.hdf5', __name__)) - nose.tools.eq_(shape, (512,)) - nose.tools.eq_(dtype, numpy.dtype('float64')) - - dtype, shape, stride = peek_all(test_utils.datafile('matlab_2d.hdf5', __name__)) - nose.tools.eq_(shape, (512, 2)) - nose.tools.eq_(dtype, numpy.dtype('float64')) - -def test_matlab_import(): - - # This test verifies we can import HDF5 datasets generated in Matlab - mfile = HDF5File(test_utils.datafile('matlab_1d.hdf5', __name__)) - nose.tools.eq_(mfile.paths(), ['/array']) - -def test_ioload_unlimited(): - - # This test verifies that a 3D array whose first dimension is unlimited - # and size equal to 1 can be read as a 2D array - mfile = load(test_utils.datafile('test7_unlimited.hdf5', __name__)) - nose.tools.eq_(mfile.ndim, 2) - -def test_attribute_version(): - - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - outfile.set_attribute('version', 32) - nose.tools.eq_(outfile.get_attribute('version'), 32) - - finally: - os.unlink(tmpname) - -def test_string_support(): - - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - attribute = 'this is my long test string with \nNew lines' - outfile.set('string', attribute) - recovered = outfile.read('string') - #nose.tools.eq_(attribute, recovered) - - finally: - del outfile - os.unlink(tmpname) - -def test_string_attribute_support(): - - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - attribute = 'this is my long test string with \nNew lines' - outfile.set_attribute('string', attribute) - recovered = outfile.get_attribute('string') - nose.tools.eq_(attribute, recovered) - - data = [1,2,3,4,5] - outfile.set('data', data) - outfile.set_attribute('string', attribute, 'data') - recovered = outfile.get_attribute('string', 'data') - nose.tools.eq_(attribute, recovered) - - finally: - os.unlink(tmpname) - -def test_can_use_set_with_iterables(): - - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - data = [1, 34.5, True] - outfile.set('data', data) - assert numpy.array_equal(data, outfile.read('data')) - - finally: - os.unlink(tmpname) - -def test_has_attribute(): - - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - i = 35 - f = 3.14 - outfile.set_attribute('int', i) - outfile.set_attribute('float', f) - assert outfile.has_attribute('int') - nose.tools.eq_(outfile.get_attribute('int'), 35) - assert outfile.has_attribute('float') - nose.tools.eq_(outfile.get_attribute('float'), 3.14) - - finally: - os.unlink(tmpname) - -def test_get_attributes(): - - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - nothing = outfile.get_attributes() - nose.tools.eq_(len(nothing), 0) - assert isinstance(nothing, dict) - i = 35 - f = 3.14 - outfile.set_attribute('int', i) - outfile.set_attribute('float', f) - d = outfile.get_attributes() - nose.tools.eq_(d['int'], i) - nose.tools.eq_(d['float'], f) - - finally: - os.unlink(tmpname) - -def test_set_compression(): - - try: - - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - data = numpy.random.random((50,50)) - outfile.set('data', data, compression=9) - recovered = outfile.read('data') - assert numpy.array_equal(data, recovered) - del outfile - - finally: - - os.unlink(tmpname) - -def test_append_compression(): - - try: - - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - data = numpy.random.random((50,50)) - for k in range(len(data)): outfile.append('data', data[k], compression=9) - recovered = outfile.read('data') - assert numpy.array_equal(data, recovered) - - finally: - - os.unlink(tmpname) - - -def test_close(): - try: - tmpname = test_utils.temporary_filename() - outfile = HDF5File(tmpname, 'w') - outfile.close() - - def test_set(): - outfile.set("Test", numpy.array([1,2])) - nose.tools.assert_raises(RuntimeError, test_set) - - def test_read(): - test = outfile.read("Test") - nose.tools.assert_raises(RuntimeError, test_read) - - def test_filename(): - fn = outfile.filename - nose.tools.assert_raises(RuntimeError, test_filename) - - finally: - os.unlink(tmpname) - -def test_copy_constructor(): - try: - tmpname = test_utils.temporary_filename() - tmpname2 = test_utils.temporary_filename() - hdf5 = HDF5File(tmpname, 'w') - shallow = HDF5File(hdf5) - deep = HDF5File(tmpname2, 'w') - hdf5.copy(deep) - - hdf5.create_group("Test") - hdf5.cd("Test") - hdf5.set("Data", numpy.random.random((10,10))) - hdf5.flush() - - assert shallow.has_group("/Test") - assert shallow.has_key("/Test/Data") - assert hdf5.filename == shallow.filename - assert hdf5.keys() == shallow.keys() - assert hdf5.cwd == shallow.cwd - - assert not deep.has_group("/Test") - assert hdf5.filename != deep.filename - assert hdf5.keys() != deep.keys() - assert hdf5.cwd != deep.cwd - assert str(shallow) - - hdf5.cd("..") - - assert hdf5.sub_groups() == shallow.sub_groups() - assert hdf5.sub_groups() != deep.sub_groups() - - assert hdf5.writable - assert shallow.writable - assert deep.writable - - - hdf5.close() - deep.close() - - def test_filename(): - fn = shallow.filename - nose.tools.assert_raises(RuntimeError, test_filename) - def test_repr(): - fn = str(shallow) - nose.tools.assert_raises(RuntimeError, test_repr) - - finally: - os.unlink(tmpname) - os.unlink(tmpname2) - - -def test_python_interfaces(): - try: - tmpname = test_utils.temporary_filename() - with HDF5File(tmpname, 'w') as hdf5: - a = numpy.arange(10) - b = a * 2 - hdf5['Data'] = a - hdf5.create_group('Group1') - hdf5['Group1/Data'] = b - assert "/Group1/Data" in hdf5 - assert [key for key in hdf5] == hdf5.keys() - assert numpy.allclose(hdf5['Data'], hdf5.get('Data')) - assert all(numpy.allclose(c, d) for c, d in zip(hdf5.values(), (a, b))) - for key, value in hdf5.items(): - assert numpy.allclose(value, hdf5[key]) - - finally: - os.unlink(tmpname) - -def unicode_test(): - filename = u"Φîłèñäϻæ.hdf5" - - # writing using unicode filename - hdf5 = HDF5File(filename, 'w') - hdf5.set('Test', range(10)) - del hdf5 - - # writing using unicode filename - hdf5 = HDF5File(filename) - assert numpy.allclose(hdf5["Test"], range(10)) - os.remove(filename) - diff --git a/bob/io/base/test_io.py b/bob/io/base/test_io.py deleted file mode 100644 index f909228..0000000 --- a/bob/io/base/test_io.py +++ /dev/null @@ -1,96 +0,0 @@ -import nose -import numpy as np -import os -from . import vstack_features, save, load -from .test_utils import temporary_filename - - -def test_io_vstack(): - - paths = [1, 2, 3, 4, 5] - - def oracle(reader, paths): - return np.vstack([reader(p) for p in paths]) - - def reader_same_size_C(path): - return np.arange(10).reshape(5, 2) - - def reader_different_size_C(path): - return np.arange(2 * path).reshape(path, 2) - - def reader_same_size_F(path): - return np.asfortranarray(np.arange(10).reshape(5, 2)) - - def reader_different_size_F(path): - return np.asfortranarray(np.arange(2 * path).reshape(path, 2)) - - def reader_same_size_C2(path): - return np.arange(30).reshape(5, 2, 3) - - def reader_different_size_C2(path): - return np.arange(6 * path).reshape(path, 2, 3) - - def reader_same_size_F2(path): - return np.asfortranarray(np.arange(30).reshape(5, 2, 3)) - - def reader_different_size_F2(path): - return np.asfortranarray(np.arange(6 * path).reshape(path, 2, 3)) - - def reader_wrong_size(path): - return np.arange(2 * path).reshape(2, path) - - # when same_size is False - for reader in [ - reader_different_size_C, - reader_different_size_F, - reader_same_size_C, - reader_same_size_F, - reader_different_size_C2, - reader_different_size_F2, - reader_same_size_C2, - reader_same_size_F2, - ]: - np.all(vstack_features(reader, paths) == oracle(reader, paths)) - - # when same_size is True - for reader in [ - reader_same_size_C, - reader_same_size_F, - reader_same_size_C2, - reader_same_size_F2, - ]: - np.all(vstack_features(reader, paths, True) == oracle(reader, paths)) - - with nose.tools.assert_raises(AssertionError): - vstack_features(reader_wrong_size, paths) - - # test actual files - paths = [temporary_filename(), temporary_filename(), temporary_filename()] - try: - # try different readers: - for reader in [ - reader_different_size_C, - reader_different_size_F, - reader_same_size_C, - reader_same_size_F, - reader_different_size_C2, - reader_different_size_F2, - reader_same_size_C2, - reader_same_size_F2, - ]: - # save some data in files - for i, path in enumerate(paths): - save(reader(i + 1), path) - # test when all data is present - reference = oracle(load, paths) - np.all(vstack_features(load, paths) == reference) - os.remove(paths[0]) - # Check if RuntimeError is raised when one of the files is missing - with nose.tools.assert_raises(RuntimeError): - vstack_features(load, paths) - finally: - try: - for path in paths: - os.remove(path) - except Exception: - pass diff --git a/bob/io/base/utils.py b/bob/io/base/utils.py new file mode 100644 index 0000000..16ccb62 --- /dev/null +++ b/bob/io/base/utils.py @@ -0,0 +1,126 @@ +import numpy as np + + +def to_matplotlib(img): + """Returns a view of the image from Bob format to matplotlib format. + This function works with images, batches of images, videos, and higher + dimensional arrays that contain images. + + Parameters + ---------- + img : numpy.ndarray + A N dimensional array containing an image in Bob format (channels + first): For an ND array (N >= 3), the image should have the following + format: ``(..., c, h, w)``. + + Returns + ------- + numpy.ndarray + A view of the ``img`` compatible with + :py:func:`matplotlib.pyplot.imshow`. + """ + if img.ndim < 3: + return img + return np.moveaxis(img, -3, -1) + + +def to_bob(img): + """Returns a view of the image from matplotlib format to Bob format. + This function works with images, batches of images, videos, and higher + dimensional arrays that contain images. + + Parameters + ---------- + img : numpy.ndarray + An image in matplotlib format (channels last): For an ND array (N >= 3), + the image should have the following format: ``(..., h, w, c)``. + + Returns + ------- + numpy.ndarray + A view of the ``img`` compatible with Bob. + """ + if img.ndim < 3: + return img + return np.moveaxis(img, -1, -3) + + +def opencvbgr_to_bob(img): + """Returns a view of the image from OpenCV BGR format to Bob RGB format. + This function works with images, batches of images, videos, and higher + dimensional arrays that contain images. + + Parameters + ---------- + img : numpy.ndarray + An image loaded by OpenCV. It needs to have at least 3 dimensions. + + Returns + ------- + numpy.ndarray + A view of the ``img`` compatible with Bob. + + Raises + ------ + ValueError + If the image dimension is less than 3. + """ + if img.ndim < 3: + raise ValueError("You need to provide at least a 3 dimensional image") + img = img[..., ::-1] + return to_bob(img) + + +def bob_to_opencvbgr(img): + """Returns a view of the image from Bob format to OpenCV BGR format. + This function works with images, batches of images, videos, and higher + dimensional arrays that contain images. + + Parameters + ---------- + img : numpy.ndarray + An image loaded by Bob. It needs to have at least 3 dimensions. + + Returns + ------- + numpy.ndarray + A view of the ``img`` compatible with OpenCV. + + Raises + ------ + ValueError + If the image dimension is less than 3. + """ + if img.ndim < 3: + raise ValueError("You need to provide at least a 3 dimensional image") + img = img[..., ::-1, :, :] + return to_matplotlib(img) + + +def imshow(img, cmap=None, **kwargs): + """Plots the images that are returned by :py:func:`bob.io.base.load` + + Parameters + ---------- + img : numpy.ndarray + A 2 or 3 dimensional array containing an image in + bob style: For a 2D array (grayscale image) should be ``(h, w)``; + A 3D array (color image) should be in the ``(c, h, w)`` format. + cmap : matplotlib.colors.Colormap + Colormap, optional, default: ``None``. + If ``cmap`` is ``None`` and ``img.ndim`` is 2, defaults to 'gray'. + ``cmap`` is ignored when ``img`` has RGB(A) information. + **kwargs + These are passed directly to :py:func:`matplotlib.pyplot.imshow` + + Returns + ------- + object + Returns whatever ``plt.imshow`` returns. + """ + import matplotlib.pyplot as plt + + if cmap is None and img.ndim == 2: + cmap = "gray" + + return plt.imshow(to_matplotlib(img), cmap=cmap, **kwargs) diff --git a/bob/io/base/version.cpp b/bob/io/base/version.cpp deleted file mode 100644 index 91ccc1d..0000000 --- a/bob/io/base/version.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @author Andre Anjos <andre.anjos@idiap.ch> - * @date Thu 7 Nov 13:50:16 2013 - * - * @brief Binds configuration information available from bob - */ - -#define BOB_IMPORT_VERSION -#include <bob.blitz/config.h> -#include <bob.blitz/cleanup.h> -#include <bob.core/config.h> -#include <bob.io.base/config.h> - -static PyObject* build_version_dictionary() { - - PyObject* retval = PyDict_New(); - if (!retval) return 0; - auto retval_ = make_safe(retval); - - if (!dict_steal(retval, "HDF5", hdf5_version())) return 0; - if (!dict_steal(retval, "Boost", boost_version())) return 0; - if (!dict_steal(retval, "Compiler", compiler_version())) return 0; - if (!dict_steal(retval, "Python", python_version())) return 0; - if (!dict_steal(retval, "NumPy", numpy_version())) return 0; - if (!dict_steal(retval, "Blitz++", blitz_version())) return 0; - if (!dict_steal(retval, "bob.blitz", bob_blitz_version())) return 0; - if (!dict_steal(retval, "bob.core", bob_core_version())) return 0; - - return Py_BuildValue("O", retval); -} - -static PyMethodDef module_methods[] = { - {0} /* Sentinel */ -}; - -PyDoc_STRVAR(module_docstr, -"Information about software used to compile the C++ Bob API" -); - -#if PY_VERSION_HEX >= 0x03000000 -static PyModuleDef module_definition = { - PyModuleDef_HEAD_INIT, - BOB_EXT_MODULE_NAME, - module_docstr, - -1, - module_methods, - 0, 0, 0, 0 -}; -#endif - -static PyObject* create_module (void) { - -# if PY_VERSION_HEX >= 0x03000000 - PyObject* m = PyModule_Create(&module_definition); - auto m_ = make_xsafe(m); - const char* ret = "O"; -# else - PyObject* m = Py_InitModule3(BOB_EXT_MODULE_NAME, module_methods, module_docstr); - const char* ret = "N"; -# endif - if (!m) return 0; - - /* register version numbers and constants */ - if (PyModule_AddIntConstant(m, "api", BOB_IO_BASE_API_VERSION) < 0) - return 0; - if (PyModule_AddStringConstant(m, "module", BOB_EXT_MODULE_VERSION) < 0) - return 0; - if (PyModule_AddObject(m, "externals", build_version_dictionary()) < 0) return 0; - - // call bob_io_base_version once to avoid compiler warning - auto _ = make_safe(bob_io_base_version()); - - return Py_BuildValue(ret, m); -} - -PyMODINIT_FUNC BOB_EXT_ENTRY_NAME (void) { -# if PY_VERSION_HEX >= 0x03000000 - return -# endif - create_module(); -} diff --git a/conda/meta.yaml b/conda/meta.yaml index 815ac14..debadfa 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -17,27 +17,16 @@ build: - "{{ PYTHON }} -m pip install . -vv" requirements: - build: - - {{ compiler('c') }} - - {{ compiler('cxx') }} - - pkg-config {{ pkg_config }} - - cmake {{ cmake }} - - make {{ make }} host: - python {{ python }} - setuptools {{ setuptools }} - pip {{ pip }} - bob.extension - - bob.blitz - - bob.core - - libblitz {{ libblitz }} - - hdf5 {{ hdf5 }} - - boost {{ boost }} + - h5py {{ h5py }} - numpy {{ numpy }} run: - python - setuptools - - boost - {{ pin_compatible('numpy') }} test: diff --git a/doc/c_cpp_api.rst b/doc/c_cpp_api.rst deleted file mode 100644 index 95ea240..0000000 --- a/doc/c_cpp_api.rst +++ /dev/null @@ -1,168 +0,0 @@ -.. vim: set fileencoding=utf-8 : -.. Andre Anjos <andre.dos.anjos@gmail.com> -.. Tue 15 Oct 14:59:05 2013 - -========= - C++ API -========= - -The C++ API of ``bob.io.base`` allows users to leverage from automatic converters -for classes in :py:class:`bob.io.base`. To use the C API, clients should first, -include the header file ``<bob.io.base/api.h>`` on their compilation units and -then, make sure to call once ``import_bob_io_base()`` at their module -instantiation, as explained at the `Python manual -<http://docs.python.org/2/extending/extending.html#using-capsules>`_. - -Here is a dummy C example showing how to include the header and where to call -the import function: - -.. code-block:: c++ - - #include <bob.io.base/api.h> - - PyMODINIT_FUNC initclient(void) { - - PyObject* m Py_InitModule("client", ClientMethods); - - if (!m) return; - - /* imports dependencies */ - if (import_bob_blitz() < 0) { - PyErr_Print(); - PyErr_SetString(PyExc_ImportError, "cannot import extension"); - return 0; - } - - if (import_bob_io_base() < 0) { - PyErr_Print(); - PyErr_SetString(PyExc_ImportError, "cannot import extension"); - return 0; - } - - } - - -Generic Functions ------------------ - -.. cpp:function:: int PyBobIo_AsTypenum(bob::core::array::ElementType et) - - Converts the input Bob element type into a ``NPY_<TYPE>`` enumeration value. - Returns ``NPY_NOTYPE`` in case of problems, and sets a - :py:exc:`RuntimeError`. - -.. cpp:function:: PyObject* PyBobIo_TypeInfoAsTuple (const bob::core::array::typeinfo& ti) - - Converts the ``bob::core::array::typeinfo&`` object into a **new reference** - to a :py:class:`tuple` with 3 elements: - - [0] - The data type as a :py:class:`numpy.dtype` object - - [1] - The shape of the object, as a tuple of integers - - [2] - The strides of the object, as a tuple of integers - - Returns ``0`` in case of failure, or a **new reference** to the tuple - described above in case of success. - - -.. cpp:function:: int PyBobIo_FilenameConverter (PyObject* o, const char** b) - - This function is meant to be used with :c:func:`PyArg_ParseTupleAndKeywords` - family of functions in the Python C-API. It converts an arbitrary input - object into a ``const char*`` If the input object is of type - ``PyUnicodeObject`` (which is the default in Python3.x) the unicode code is - properly decoded using :c:func:`PyUnicode_AsEncodedString` with ``encoding`` - set to ``Py_FileSystemDefaultEncoding`` and ``errors`` set to ``"strict"``. - - Objects which are not ``PyUnicodeObject`` are first coerced into a - bytes/string before converting to the ``const char*`` object using - :c:func:`PyObject_Bytes` (on Python3.x) and :c:func:`PyObject_Str` - (on Python 2.x). - - Returns 0 if an error is detected, 1 on success. - - .. note:: - Since version 2.2, this function converts into ``const char*`` directly. - Before version 2.2, it was returning either ``PyBytesObject`` (Python 3) - or ``PyStringObject`` (Python 2). - - -Bob File Support ----------------- - -.. cpp:type:: PyBobIoFileObject - - The pythonic object representation for a ``bob::io::base::File`` object. - - .. code-block:: cpp - - typedef struct { - PyObject_HEAD - boost::shared_ptr<bob::io::base::File> f; - } PyBobIoFileObject; - - .. cpp:member:: boost::shared_ptr<bob::io::base::File> f - - A pointer to a file being read or written. - -.. cpp:type:: PyBobIoFileIteratorObject - - The pythonic object representation for an iterator over a - ``bob::io::base::File`` object. - - .. code-block:: cpp - - typedef struct { - PyObject_HEAD - PyBobIoFileObject* pyfile; - Py_ssize_t curpos; - } PyBobIoFileIteratorObject; - - .. cpp:member:: PyBobIoFileObject* pyfile - - A pointer to the pythonic representation of a file. - - .. cpp:member:: Py_ssize_t curpos - - The current position at the file being pointed to. - - -Bob HDF5 Support ----------------- - -.. cpp:type:: PyBobIoHDF5FileObject - - The pythonic object representation for a ``bob::io::base::HDF5File`` object. - - .. code-block:: cpp - - typedef struct { - PyObject_HEAD - boost::shared_ptr<bob::io::base::HDF5File> f; - } PyBobIoHDF5FileObject; - - .. cpp:member:: boost::shared_ptr<bob::io::base::HDF5File> f - - A pointer to a Bob object being used to read/write data into an HDF5 - file. - - -.. cpp:function:: int PyBobIoHDF5File_Check(PyObject* o) - - Checks if the input object ``o`` is a ``PyBobIoHDF5FileObject``. Returns - ``1`` if it is, and ``0`` otherwise. - - -.. cpp:function:: int PyBobIoHDF5File_Converter(PyObject* o, PyBobIoHDF5FileObject** a) - - This function is meant to be used with :c:func:`PyArg_ParseTupleAndKeywords` - family of functions in the Python C-API. It checks the input object to be of - type ``PyBobIoHDF5FileObject`` and sets a **new reference** to it (in - ``*a``) if it is the case. Returns ``0`` in case of failure, ``1`` in case - of success. - -.. include:: links.rst diff --git a/doc/extra-intersphinx.txt b/doc/extra-intersphinx.txt index 4a36b0b..9c61c73 100644 --- a/doc/extra-intersphinx.txt +++ b/doc/extra-intersphinx.txt @@ -1,2 +1 @@ -scipy -bob.io.image +scipy \ No newline at end of file diff --git a/doc/guide.rst b/doc/guide.rst deleted file mode 100644 index 0c20a86..0000000 --- a/doc/guide.rst +++ /dev/null @@ -1,382 +0,0 @@ -.. vim: set fileencoding=utf-8 : -.. Andre Anjos <andre.dos.anjos@gmail.com> -.. Fri 16 May 11:48:13 2014 CEST - -============ - User Guide -============ - -This section gives an overview of the operations for storing and retrieving the -basic data structures in |project|, such as `NumPy`_ arrays. |project| uses -`HDF5`_ format for storing binary coded data. Using the |project| support for -`HDF5`_, it is very simple to import and export data. - -`HDF5`_ uses a neat descriptive language for representing the data in the HDF5 -files, called Data Description Language (`DDL`_). - -To perform the functionalities given in this section, you should have `NumPy`_ -and |project| loaded into the `Python`_ environment. - -.. testsetup:: * - - import numpy - import bob.io.base - import tempfile - import os - - current_directory = os.path.realpath(os.curdir) - temp_dir = tempfile.mkdtemp(prefix='bob_doctest_') - os.chdir(temp_dir) - -HDF5 standard utilities ------------------------ - -Before explaining the basics of reading and writing to `HDF5`_ files, it is -important to list some `HDF5`_ standard utilities for checking the content of -an `HDF5`_ file. These are supplied by the `HDF5`_ project. - -``h5dump`` - Dumps the content of the file using the DDL. - -``h5ls`` - Lists the content of the file using DDL, but does not show the data. - -``h5diff`` - Finds the differences between HDF5 files. - -I/O operations using the class `bob.io.base.HDF5File` ------------------------------------------------------- - -Writing operations -~~~~~~~~~~~~~~~~~~ - -Let's take a look at how to write simple scalar data such as integers or -floats. - -.. doctest:: - - >>> an_integer = 5 - >>> a_float = 3.1416 - >>> f = bob.io.base.HDF5File('testfile1.hdf5', 'w') - >>> f.set('my_integer', an_integer) - >>> f.set('my_float', a_float) - >>> del f - -If after this you use the **h5dump** utility on the file ``testfile1.hdf5``, -you will verify that the file now contains: - -.. code-block:: none - - HDF5 "testfile1.hdf5" { - GROUP "/" { - DATASET "my_float" { - DATATYPE H5T_IEEE_F64LE - DATASPACE SIMPLE { ( 1 ) / ( 1 ) } - DATA { - (0): 3.1416 - } - } - DATASET "my_integer" { - DATATYPE H5T_STD_I32LE - DATASPACE SIMPLE { ( 1 ) / ( 1 ) } - DATA { - (0): 5 - } - } - } - } - -.. note:: - - In |project|, when you open a HDF5 file, you can choose one of the following - options: - - **'r'** Open the file in reading mode; writing operations will fail (this is the default). - - **'a'** Open the file in reading and writing mode with appending. - - **'w'** Open the file in reading and writing mode, but truncate it. - - **'x'** Read/write/append with exclusive access. - -The dump shows that there are two datasets inside a group named ``/`` in the -file. HDF5 groups are like file system directories. They create namespaces for -the data. In the root group (or directory), you will find the two variables, -named as you set them to be. The variable names are the complete path to the -location where they live. You could write a new variable in the same file but -in a different directory like this: - -.. doctest:: - - >>> f = bob.io.base.HDF5File('testfile1.hdf5', 'a') - >>> f.create_group('/test') - >>> f.set('/test/my_float', numpy.float32(6.28)) - >>> del f - -Line 1 opens the file for reading and writing, but without truncating it. This -will allow you to access the file contents. Next, the directory ``/test`` is -created and a new variable is written inside the subdirectory. As you can -verify, **for simple scalars**, you can also force the storage type. Where -normally one would have a 64-bit real value, you can impose that this variable -is saved as a 32-bit real value. You can verify the dump correctness with -``h5dump``: - -.. code-block:: none - - GROUP "/" { - ... - GROUP "test" { - DATASET "my_float" { - DATATYPE H5T_IEEE_F32LE - DATASPACE SIMPLE { ( 1 ) / ( 1 ) } - DATA { - (0): 6.28 - } - } - } - } - -Notice the subdirectory ``test`` has been created and inside it a floating -point number has been stored. Such a float point number has a 32-bit precision -as it was defined. - -.. note:: - - If you need to place lots of variables in a subfolder, it may be better to - setup the prefix folder before starting the writing operations on the - :py:class:`bob.io.base.HDF5File` object. You can do this using the method - :py:meth:`bob.io.base.HDF5File.cd`. Look up its help for more information and usage - instructions. - -Writing arrays is a little simpler as the :py:class:`numpy.ndarray` objects -encode all the type information we need to write and read them correctly. Here -is an example: - -.. doctest:: - - >>> A = numpy.array(range(4), 'int8').reshape(2,2) - >>> f = bob.io.base.HDF5File('testfile1.hdf5', 'a') - >>> f.set('my_array', A) - >>> f.close() - -The result of running ``h5dump`` on the file ``testfile1.hdf5`` should be: - -.. code-block:: none - - ... - DATASET "my_array" { - DATATYPE H5T_STD_I8LE - DATASPACE SIMPLE { ( 2, 2 ) / ( 2, 2 ) } - DATA { - (0,0): 0, 1, - (1,0): 2, 3 - } - } - ... - -You don't need to limit yourself to single variables, you can also save lists -of scalars and arrays using the function :py:meth:`bob.io.base.HDF5File.append` -instead of :py:meth:`bob.io.base.HDF5File.set`. - -Reading operations -~~~~~~~~~~~~~~~~~~ - -Reading data from a file that you just wrote to is just as easy. For this task -you should use :py:meth:`bob.io.base.HDF5File.read`. The read method will read -all the contents of the variable pointed to by the given path. This is the -normal way to read a variable you have written with -:py:meth:`bob.io.base.HDF5File.set`. If you decided to create a list of scalar -or arrays, the way to read that up would be using -:py:meth:`bob.io.base.HDF5File.lread` instead. Here is an example: - -.. doctest:: - - >>> f = bob.io.base.HDF5File('testfile1.hdf5') #read only - >>> f.read('my_integer') #reads integer - 5 - >>> print(f.read('my_array')) # reads the array - [[0 1] - [2 3]] - >>> del f - -Now let's look at an example where we have used -:py:meth:`bob.io.base.HDF5File.append` instead of -:py:meth:`bob.io.base.HDF5File.set` to write data to a file. That is normally -the case when you write lists of variables to a dataset. - -.. doctest:: - - >>> f = bob.io.base.HDF5File('testfile2.hdf5', 'w') - >>> f.append('arrayset', numpy.array(range(10), 'float64')) - >>> f.append('arrayset', 2*numpy.array(range(10), 'float64')) - >>> f.append('arrayset', 3*numpy.array(range(10), 'float64')) - >>> numpy.allclose((f.lread('arrayset', 0)),[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) - True - >>> numpy.allclose( (f.lread('arrayset', 2)), [ 0., 3., 6., 9., 12., 15., 18., 21., 24., 27.]) - True - >>> del f - -This is what the ``h5dump`` of the file would look like: - -.. code-block:: none - - HDF5 "testfile4.hdf5" { - GROUP "/" { - DATASET "arrayset" { - DATATYPE H5T_IEEE_F64LE - DATASPACE SIMPLE { ( 3, 10 ) / ( H5S_UNLIMITED, 10 ) } - DATA { - (0,0): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - (1,0): 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, - (2,0): 0, 3, 6, 9, 12, 15, 18, 21, 24, 27 - } - } - } - } - -Notice that the expansion limits for the first dimension have been correctly -set by |project| so you can insert an *unlimited* number of 1D float vectors. -Of course, you can also read the whole contents of the arrayset in a single -shot: - -.. doctest:: - - >>> f = bob.io.base.HDF5File('testfile2.hdf5') - >>> numpy.allclose((f.read('arrayset')),[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],[ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18.],[ 0., 3., 6., 9., 12., 15., 18., 21., 24., 27.]]) - True - -As you can see, the only difference between -:py:meth:`bob.io.base.HDF5File.read` and -:py:meth:`bob.io.base.HDF5File.lread` is on how |project| considers the -available data (as a single array with N dimensions or as a set of arrays with -N-1 dimensions). In the first example, you would have also been able to read -the variable `my_array` as an arrayset using -:py:meth:`bob.io.base.HDF5File.lread` instead of -:py:meth:`bob.io.base.HDF5File.read`. In this case, each position readout -would return a 1D uint8 array instead of a 2D array. - - -Pythonic operations on HDF5 files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can use some Pythonic opertations on :py:class:`bob.io.base.HDF5File`: - -* Use the ``with`` statement to open (and automatically close) HDF5 files. -* iterate over :py:class:`bob.io.base.HDF5File` objects to get an - iterable of keys instead of calling :py:meth:`bob.io.base.HDF5File.keys`. -* use the ``in`` keyword instead of calling - :py:meth:`bob.io.base.HDF5File.has_key`. -* use Python's dictionary syntax instead of :py:meth:`bob.io.base.HDF5File.set` - and :py:meth:`bob.io.base.HDF5File.get`. - -For example: - - -.. doctest:: - - >>> f = bob.io.base.HDF5File('testfile3.hdf5', 'w') - >>> array = numpy.arange(5) - >>> f['my_array'] = array # f.set('my_array', array) - >>> f['my_array'] # f.get('my_array') - array([0, 1, 2, 3, 4]) - >>> 'my_array' in f # f.has_key('my_array') - True - >>> [key for key in f] # f.keys() - ['/my_array'] - >>> f.create_group('group1') - >>> f.cd('group1') - >>> f['my_array_in_group'] = array - >>> f.cd('/') - >>> # keys(), values(), and items() just like a dictionary - >>> [key for key in f.keys()] - ['/my_array', '/group1/my_array_in_group'] - >>> [value for value in f.values()] - [array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])] - >>> [(key, value) for key, value in f.items()] - [('/my_array', array([0, 1, 2, 3, 4])), ('/group1/my_array_in_group', array([0, 1, 2, 3, 4]))] - >>> f.close() - >>> # using a with statement to open and close files - >>> with bob.io.base.HDF5File('testfile3.hdf5', 'a') as f: - ... f['second_array'] = array - >>> f = bob.io.base.HDF5File('testfile3.hdf5', 'r') - >>> 'second_array' in f - True - -Array interfaces ----------------- - -What we have shown so far is the generic API to read and write data using HDF5. -You will use it when you want to import or export data from |project| into -other software frameworks, debug your data or just implement your own classes -that can serialize and de-serialize from HDF5 file containers. In |project|, -most of the time you will be working with :py:class:`numpy.ndarray`\s. In -special situations though, you may be asked to handle -:py:class:`bob.io.base.File`\s. :py:class:`bob.io.base.File` objects create a -transparent connection between C++ (`Blitz++`_) / Python (`NumPy`_) arrays and -file access. You specify the filename from which you want to input data and -the :py:class:`bob.io.base.File` object decides what is the best codec to be -used (from the extension) and how to read the data back into your array. - -To create an :py:class:`bob.io.base.File` from a file path, just do the -following: - -.. doctest:: - - >>> a = bob.io.base.File('testfile2.hdf5', 'r') - >>> a.filename - 'testfile2.hdf5' - -:py:class:`bob.io.base.File`\s simulate containers for -:py:class:`numpy.ndarray`\s, transparently accessing the file data when -requested. Note, however, that when you instantiate an -:py:class:`bob.io.base.File` it does **not** load the file contents into -memory. It waits until you emit another explicit instruction to do so. We do -this with the :py:meth:`bob.io.base.File.read` method: - -.. doctest:: - - >>> array = a.read() - >>> numpy.allclose(array, [[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],[ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18.],[ 0., 3., 6., 9., 12., 15., 18., 21., 24., 27.]]) - True - -Every time you say :py:meth:`bob.io.base.File.read`, the file contents will be -read from the file and into a new array. - -Saving arrays to the :py:class:`bob.io.base.File` is as easy, just call the -:py:meth:`bob.io.base.File.write` method: - -.. doctest:: - - >>> f = bob.io.base.File('copy1.hdf5', 'w') - >>> f.write(array) - -Numpy ndarray shortcuts ------------------------ - -To just load an :py:class:`numpy.ndarray` in memory, you can use a short cut -that lives at :py:func:`bob.io.base.load`. With it, you don't have to go -through the :py:class:`bob.io.base.File` container: - -.. doctest:: - - >>> t = bob.io.base.load('testfile2.hdf5') - >>> numpy.allclose(t, [[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], [ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18.],[ 0., 3., 6., 9., 12., 15., 18., 21., 24., 27.]]) - True - -You can also directly save :py:class:`numpy.ndarray`\s without going through -the :py:class:`bob.io.base.File` container: - -.. doctest:: - - >>> bob.io.base.save(t, 'copy2.hdf5') - -.. note:: - - Under the hood, we still use the :py:class:`bob.io.base.File` API to execute - the read and write operations. Have a look at the manual section for - :py:mod:`bob.io.base` for more details and other shortcuts available. - - -.. Place here your external references -.. include:: links.rst -.. _ddl: http://www.hdfgroup.org/HDF5/doc/ddl.html diff --git a/doc/index.rst b/doc/index.rst index c24f651..74ade76 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -13,12 +13,10 @@ Below is the old documentation. This module contains a basic interface to read and write files of various types. It provides generic functions :py:func:`bob.io.base.save` and -:py:func:`bob.io.base.load` to write and read various types of data. In this -interface, data is mainly written using the :py:class:`bob.io.base.HDF5File` -interface. To enable further types of IO, please import one of the following +:py:func:`bob.io.base.load` to write and read various types of data. +To enable further types of IO, please import one of the following packages (the list might not be exhaustive): -* :ref:`bob.io.image` to load and save images of various kinds Documentation @@ -27,9 +25,7 @@ Documentation .. toctree:: :maxdepth: 2 - guide - py_api - c_cpp_api + py_api TODO ---- diff --git a/doc/nitpick-exceptions.txt b/doc/nitpick-exceptions.txt index 97040cc..f61551f 100644 --- a/doc/nitpick-exceptions.txt +++ b/doc/nitpick-exceptions.txt @@ -1,37 +1,6 @@ -# these are actually c types -cpp:type PyObject -cpp:type Py_ssize_t -cpp:typeOrConcept PyObject -cpp:typeOrConcept Py_ssize_t - -# no reference exists for these -cpp:type bob -cpp:type bob::core -cpp:type bob::core::array -cpp:type bob::core::array::typeinfo -cpp:type bob::core::array::ElementType -cpp:type boost -cpp:type boost::shared_ptr -cpp:type bob::io -cpp:type bob::io::base -cpp:type bob::io::base::File -cpp:type bob::io::base::HDF5File -cpp:typeOrConcept bob -cpp:typeOrConcept bob::core -cpp:typeOrConcept bob::core::array -cpp:typeOrConcept bob::core::array::typeinfo -cpp:typeOrConcept bob::core::array::ElementType -cpp:typeOrConcept boost -cpp:typeOrConcept boost::shared_ptr -cpp:typeOrConcept bob::io -cpp:typeOrConcept bob::io::base -cpp:typeOrConcept bob::io::base::File -cpp:typeOrConcept bob::io::base::HDF5File - # exceptions are not found in python 2.7 py:exc RuntimeError py:class tuple -c:func PyUnicode_FSConverter # these don't exists on numpy's manual py:class numpy.uint8 diff --git a/doc/py_api.rst b/doc/py_api.rst index 512c928..bec56c4 100644 --- a/doc/py_api.rst +++ b/doc/py_api.rst @@ -8,46 +8,14 @@ This section includes information for using the pure Python API of ``bob.io.base``. - -Classes -------- - -.. autosummary:: - bob.io.base.File - bob.io.base.HDF5File - Functions --------- .. autosummary:: bob.io.base.load - bob.io.base.merge bob.io.base.save - bob.io.base.append - bob.io.base.peek - bob.io.base.peek_all bob.io.base.create_directories_safe bob.io.base.vstack_features - bob.io.base.extensions - bob.io.base.get_config - -Test Utilities --------------- - -These functions might be useful when you are writing your nose tests. -Please note that this is not part of the default ``bob.io.base`` API, so in order to use it, you have to ``import bob.io.base.test_utils`` separately. - -.. autosummary:: - bob.io.base.test_utils.datafile - bob.io.base.test_utils.temporary_filename - bob.io.base.test_utils.extension_available - - -Details -------- -.. automodule:: bob.io.base - :inherited-members: -.. automodule:: bob.io.base.test_utils diff --git a/requirements.txt b/requirements.txt index f2e31db..8fd79bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1 @@ bob.extension -bob.blitz -bob.core > 2.1.3 diff --git a/setup.py b/setup.py index 7638992..99c943d 100644 --- a/setup.py +++ b/setup.py @@ -2,217 +2,44 @@ # vim: set fileencoding=utf-8 : # Andre Anjos <andre.anjos@idiap.ch> # Mon 16 Apr 08:18:08 2012 CEST +# +from setuptools import setup, dist -bob_packages = ['bob.core'] +dist.Distribution(dict(setup_requires=["bob.extension"])) -from setuptools import setup, find_packages, dist -dist.Distribution(dict(setup_requires=['bob.extension', 'bob.blitz'] + bob_packages)) -from bob.extension.utils import egrep, find_header, find_library -from bob.extension import pkgconfig -from bob.blitz.extension import Extension, Library, build_ext - -from bob.extension.utils import load_requirements -build_requires = load_requirements() - -# Define package version -version = open("version.txt").read().rstrip() - -packages = ['boost'] -boost_modules = ['system', 'filesystem'] - -def libhdf5_version(header): - - vv = egrep(header, r"#\s*define\s+H5_VERSION\s+\"([\d\.]+)\"") - if not len(vv): return None - return vv[0].group(1) - -class hdf5: - - def __init__ (self): - """ - Searches for libhdf5 in stock locations. Allows user to override. - - If the user sets the environment variable BOB_PREFIX_PATH, that prefixes - the standard path locations. - - """ - import os - - self.name = 'hdf5' - - # try to locate pkg-config on our own first - try: - - header = 'hdf5.h' - - candidates = find_header(header) - - if not candidates: - raise RuntimeError("could not find %s's `%s' - have you installed %s on this machine?" % (self.name, header, self.name)) - - self.include_directories = [os.path.dirname(candidates[0])] - directory = os.path.dirname(candidates[0]) - version_header = os.path.join(directory, 'H5pubconf.h') - self.version = libhdf5_version(version_header) - - # normalize - self.include_directories = [os.path.normpath(i) for i in self.include_directories] - - # find library - prefix = os.path.dirname(os.path.dirname(self.include_directories[0])) - module = 'hdf5' - candidates = find_library(module, version=self.version, prefixes=[prefix], only_static=False) - - if not candidates: - raise RuntimeError("cannot find required %s binary module `%s' - make sure libhdf5 is installed on `%s'" % (self.name, module, prefix)) - - # libraries - self.libraries = [] - name, ext = os.path.splitext(os.path.basename(candidates[0])) - if ext in ['.so', '.a', '.dylib', '.dll']: - self.libraries.append(name[3:]) #strip 'lib' from the name - else: #link against the whole thing - self.libraries.append(':' + os.path.basename(candidates[0])) - - # library path - self.library_directories = [os.path.dirname(candidates[0])] - - except RuntimeError: - # now, we try to use pkg-config, which seems to be only available on Debian - pkg = pkgconfig('hdf5') - self.include_directories = pkg.include_directories() - version_header = os.path.join(self.include_directories[0], 'H5pubconf.h') - self.version = libhdf5_version(version_header) - self.libraries = pkg.libraries() - self.library_directories = pkg.library_directories() - - - def macros(self): - return [ - ('HAVE_%s' % self.name.upper(), '1'), - # see https://portal.hdfgroup.org/display/HDF5/Migrating+from+HDF5+1.10+to+HDF5+1.12 - ('H5_USE_110_API', '1'), - ] - - -hdf5_pkg = hdf5() - -system_include_dirs = hdf5_pkg.include_directories - -library_dirs = hdf5_pkg.library_directories - -libraries = hdf5_pkg.libraries - -define_macros = hdf5_pkg.macros() +from bob.extension.utils import load_requirements, find_packages +install_requires = load_requirements() +# The only thing we do in this file is to call the setup() function with all +# parameters that define our package. setup( - - name='bob.io.base', - version=version, - description='Basic IO for Bob', - url='http://gitlab.idiap.ch/bob/bob.io.base', - license='BSD', - author='Andre Anjos', - author_email='andre.anjos@idiap.ch', - - long_description=open('README.rst').read(), - + # This is the basic information about your project. Modify all this + # information before releasing code publicly. + name="bob.io.base", + version=open("version.txt").read().rstrip(), + description="Basic IO for Bob", + url="http://gitlab.idiap.ch/bob/bob.io.base", + license="BSD", + author="Andre Anjos", + author_email="andre.anjos@idiap.ch", + long_description=open("README.rst").read(), packages=find_packages(), include_package_data=True, zip_safe=False, - - setup_requires = build_requires, - install_requires = build_requires, - - - - ext_modules = [ - Extension("bob.io.base.version", - [ - "bob/io/base/version.cpp", - ], - define_macros = define_macros, - system_include_dirs = system_include_dirs, - version = version, - bob_packages = bob_packages, - packages = packages, - boost_modules = boost_modules, - ), - - Library("bob.io.base.bob_io_base", - [ - "bob/io/base/cpp/CodecRegistry.cpp", - "bob/io/base/cpp/File.cpp", - "bob/io/base/cpp/HDF5ArrayFile.cpp", - "bob/io/base/cpp/HDF5Attribute.cpp", - "bob/io/base/cpp/HDF5Dataset.cpp", - "bob/io/base/cpp/HDF5File.cpp", - "bob/io/base/cpp/HDF5Group.cpp", - "bob/io/base/cpp/HDF5Types.cpp", - "bob/io/base/cpp/HDF5Utils.cpp", - "bob/io/base/cpp/reorder.cpp", - "bob/io/base/cpp/utils.cpp", - "bob/io/base/cpp/array.cpp", - "bob/io/base/cpp/array_type.cpp", - "bob/io/base/cpp/blitz_array.cpp", - ], - libraries = libraries, - library_dirs = library_dirs, - system_include_dirs = system_include_dirs, - define_macros = define_macros, - version = version, - bob_packages = bob_packages, - packages = packages, - boost_modules = boost_modules, - ), - - Extension("bob.io.base._library", - [ - "bob/io/base/bobskin.cpp", - "bob/io/base/codec.cpp", - "bob/io/base/file.cpp", - "bob/io/base/hdf5.cpp", - "bob/io/base/main.cpp", - ], - library_dirs = library_dirs, - libraries = libraries, - define_macros = define_macros, - system_include_dirs = system_include_dirs, - version = version, - bob_packages = bob_packages, - packages = packages, - boost_modules = boost_modules, - ), - - Extension("bob.io.base._test", - [ - "bob/io/base/test.cpp", - ], - library_dirs = library_dirs, - libraries = libraries, - define_macros = define_macros, - system_include_dirs = system_include_dirs, - version = version, - bob_packages = bob_packages, - packages = packages, - boost_modules = boost_modules, - ), + setup_requires=install_requires, + install_requires=install_requires, + # Classifiers are important if you plan to distribute this package through + # PyPI. You can find the complete list of classifiers that are valid and + # useful here (http://pypi.python.org/pypi?%3Aaction=list_classifiers). + classifiers=[ + "Framework :: Bob", + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Topic :: Software Development :: Libraries :: Python Modules", ], - - cmdclass = { - 'build_ext': build_ext - }, - - classifiers = [ - 'Framework :: Bob', - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Natural Language :: English', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - - ) +) -- GitLab