From 22e754c7d676360864712f94cecdbd715043b207 Mon Sep 17 00:00:00 2001 From: Andre Anjos <andre.dos.anjos@gmail.com> Date: Wed, 14 May 2014 15:22:55 +0200 Subject: [PATCH] Documentation patches --- doc/c_cpp_api.rst | 30 +++++---- doc/conf.py | 12 ++-- doc/guide.rst | 152 ++++++++++++++++++++++++---------------------- doc/index.rst | 10 +-- 4 files changed, 107 insertions(+), 97 deletions(-) diff --git a/doc/c_cpp_api.rst b/doc/c_cpp_api.rst index 2333977..5af4059 100644 --- a/doc/c_cpp_api.rst +++ b/doc/c_cpp_api.rst @@ -6,10 +6,10 @@ C++ API ========= -The C++ API of ``xbob.io`` allows users to leverage from automatic converters -for classes in :py:class:`xbob.io`. To use the C API, clients should first, -include the header file ``<xbob.io/api.h>`` on their compilation units and -then, make sure to call once ``import_xbob_io()`` at their module +The C++ API of ``xbob.io.base`` allows users to leverage from automatic converters +for classes in :py:class:`xbob.io.base`. To use the C API, clients should first, +include the header file ``<xbob.io.base/api.h>`` on their compilation units and +then, make sure to call once ``import_xbob_io_base()`` at their module instantiation, as explained at the `Python manual <http://docs.python.org/2/extending/extending.html#using-capsules>`_. @@ -18,7 +18,7 @@ the import function: .. code-block:: c++ - #include <xbob.io/api.h> + #include <xbob.io.base/api.h> PyMODINIT_FUNC initclient(void) { @@ -26,21 +26,25 @@ the import function: if (!m) return; - // imports the NumPy C-API - import_array(); + /* imports dependencies */ + if (import_xbob_blitz() < 0) { + PyErr_Print(); + PyErr_SetString(PyExc_ImportError, "cannot import extension"); + return 0; + } - // imports blitz.array C-API - import_xbob_blitz(); - - // imports xbob.io C-API - import_xbob_io(); + if (import_xbob_io_base() < 0) { + PyErr_Print(); + PyErr_SetString(PyExc_ImportError, "cannot import extension"); + return 0; + } } .. note:: The include directory can be discovered using - :py:func:`xbob.io.get_include`. + :py:func:`xbob.io.base.get_include`. Generic Functions ----------------- diff --git a/doc/conf.py b/doc/conf.py index 1ada075..6c479ba 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -58,12 +58,12 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'xbob.io' +project = u'xbob.io.base' import time copyright = u'%s, Idiap Research Institute' % time.strftime('%Y') # Grab the setup entry -distribution = pkg_resources.require('xbob.io')[0] +distribution = pkg_resources.require('xbob.io.base')[0] # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -129,7 +129,7 @@ if sphinx.__version__ >= "1.0": #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = 'xbob_io' +#html_short_title = 'xbob_io_base' # The name of an image file (relative to this directory) to place at the top # of the sidebar. @@ -187,7 +187,7 @@ html_favicon = 'img/favicon.ico' #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'xbob_io_doc' +htmlhelp_basename = 'xbob_io_base_doc' # -- Options for LaTeX output -------------------------------------------------- @@ -201,7 +201,7 @@ latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'xbob_io.tex', u'Bob I/O Routines', + ('index', 'xbob_io_base.tex', u'Core Bob I/O Routines', u'Biometrics Group, Idiap Research Institute', 'manual'), ] @@ -241,7 +241,7 @@ rst_epilog = """ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'xbob_io', u'Bob I/O Routines Documentation', [u'Idiap Research Institute'], 1) + ('index', 'xbob_io_base', u'Core Bob I/O Routines Documentation', [u'Idiap Research Institute'], 1) ] # Default processing flags for sphinx diff --git a/doc/guide.rst b/doc/guide.rst index 57bb29a..491ef1b 100644 --- a/doc/guide.rst +++ b/doc/guide.rst @@ -5,7 +5,7 @@ .. testsetup:: iotest import numpy - import xbob.io + import xbob.io.base ============ User Guide @@ -25,7 +25,7 @@ and |project| loaded into the `Python`_ environment. .. testsetup:: * import numpy - import xbob.io + import xbob.io.base import tempfile import os @@ -49,8 +49,8 @@ an `HDF5`_ file. These are supplied by the `HDF5`_ project. ``h5diff`` Finds the differences between HDF5 files. -I/O operations using the class `xbob.io.HDF5File` -------------------------------------------------- +I/O operations using the class `xbob.io.base.HDF5File` +------------------------------------------------------ Writing operations ------------------ @@ -62,7 +62,7 @@ floats. >>> an_integer = 5 >>> a_float = 3.1416 - >>> f = xbob.io.HDF5File('testfile1.hdf5', 'w') + >>> f = xbob.io.base.HDF5File('testfile1.hdf5', 'w') >>> f.set('my_integer', an_integer) >>> f.set('my_float', a_float) >>> del f @@ -113,7 +113,7 @@ in a different directory like this: .. doctest:: - >>> f = xbob.io.HDF5File('testfile1.hdf5', 'a') + >>> f = xbob.io.base.HDF5File('testfile1.hdf5', 'a') >>> f.create_group('/test') >>> f.set('/test/my_float', numpy.float32(6.28)) >>> del f @@ -149,7 +149,7 @@ as it was defined. 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:`xbob.io.HDF5File` object. You can do this using the method + :py:class:`xbob.io.base.HDF5File` object. You can do this using the method :py:meth:`HDF5File.cd`. Look up its help for more information and usage instructions. @@ -160,7 +160,7 @@ is an example: .. doctest:: >>> A = numpy.array(range(4), 'int8').reshape(2,2) - >>> f = xbob.io.HDF5File('testfile1.hdf5', 'a') + >>> f = xbob.io.base.HDF5File('testfile1.hdf5', 'a') >>> f.set('my_array', A) >>> del f @@ -180,22 +180,23 @@ The result of running ``h5dump`` on the file ``testfile3.hdf5`` should be: ... You don't need to limit yourself to single variables, you can also save lists -of scalars and arrays using the function :py:meth:`xbob.io.HDF5.append` instead -of :py:meth:`xbob.io.HDF5.set`. +of scalars and arrays using the function :py:meth:`xbob.io.base.HDF5.append` +instead of :py:meth:`xbob.io.base.HDF5.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:`xbob.io.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:`xbob.io.HDF5File.set`. If -you decided to create a list of scalar or arrays, the way to read that up would -be using :py:meth:`xbob.io.HDF5File.lread` instead. Here is an example: +you should use :py:meth:`xbob.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:`xbob.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:`xbob.io.base.HDF5File.lread` instead. Here is an example: .. doctest:: - >>> f = xbob.io.HDF5File('testfile1.hdf5') #read only + >>> f = xbob.io.base.HDF5File('testfile1.hdf5') #read only >>> f.read('my_integer') #reads integer 5 >>> print(f.read('my_array')) # reads the array @@ -204,13 +205,13 @@ be using :py:meth:`xbob.io.HDF5File.lread` instead. Here is an example: >>> del f Now let's look at an example where we have used -:py:meth:`xbob.io.HDF5File.append` instead of :py:meth:`xbob.io.HDF5File.set` -to write data to a file. That is normally the case when you write lists of -variables to a dataset. +:py:meth:`xbob.io.base.HDF5File.append` instead of +:py:meth:`xbob.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 = xbob.io.HDF5File('testfile2.hdf5', 'w') + >>> f = xbob.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')) @@ -245,19 +246,21 @@ shot: .. doctest:: - >>> f = xbob.io.HDF5File('testfile2.hdf5') + >>> f = xbob.io.base.HDF5File('testfile2.hdf5') >>> print(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.]] -As you can see, the only difference between :py:meth:`xbob.io.HDF5File.read` -and :py:meth:`xbob.io.HDF5File.lread` is on how |project| considers the +As you can see, the only difference between +:py:meth:`xbob.io.base.HDF5File.read` and +:py:meth:`xbob.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:`xbob.io.HDF5File.lread` -instead of :py:meth:`xbob.io.HDF5File.read`. In this case, each position -readout would return a 1D uint8 array instead of a 2D array. +the variable `my_array` as an arrayset using +:py:meth:`xbob.io.base.HDF5File.lread` instead of +:py:meth:`xbob.io.base.HDF5File.read`. In this case, each position readout +would return a 1D uint8 array instead of a 2D array. Array interfaces ---------------- @@ -268,25 +271,27 @@ 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.ndarrays`\s. In special situations though, you may be asked to handle -:py:class:`xbob.io.File`\s. :py:class:`xbob.io.File` objects create a +:py:class:`xbob.io.base.File`\s. :py:class:`xbob.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:`xbob.io.File` object decides what is the best codec to be used -(from the extension) and how to read the data back into your array. +the :py:class:`xbob.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:`xbob.io.File` from a file path, just do the following: +To create an :py:class:`xbob.io.base.File` from a file path, just do the +following: .. doctest:: - >>> a = xbob.io.File('testfile2.hdf5', 'r') + >>> a = xbob.io.base.File('testfile2.hdf5', 'r') >>> a.filename 'testfile2.hdf5' -:py:class:`xbob.io.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:`xbob.io.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:`xbob.io.File.read` method: +:py:class:`xbob.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:`xbob.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:`xbob.io.base.File.read` method: .. doctest:: @@ -296,44 +301,44 @@ do so. We do this with the :py:meth:`xbob.io.File.read` method: [ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18.], [ 0., 3., 6., 9., 12., 15., 18., 21., 24., 27.]]) -Every time you say :py:meth:`xbob.io.File.read`, the file contents will be read -from the file and into a new array. +Every time you say :py:meth:`xbob.io.base.File.read`, the file contents will be +read from the file and into a new array. -Saving arrays to the :py:class:`xbob.io.File` is as easy, just call the -:py:meth:`xbob.io.File.write` method: +Saving arrays to the :py:class:`xbob.io.base.File` is as easy, just call the +:py:meth:`xbob.io.base.File.write` method: .. doctest:: - >>> f = xbob.io.File('copy1.hdf5', 'w') + >>> f = xbob.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:`xbob.io.load`. With it, you don't have to go through -the :py:class:`xbob.io.File` container: +that lives at :py:func:`xbob.io.base.load`. With it, you don't have to go +through the :py:class:`xbob.io.base.File` container: .. doctest:: - >>> t = xbob.io.load('testfile2.hdf5') + >>> t = xbob.io.base.load('testfile2.hdf5') >>> t 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.]]) -You can also directly save :py:class:`numpy.ndarray`\s without going -through the :py:class:`xbob.io.Array` container: +You can also directly save :py:class:`numpy.ndarray`\s without going through +the :py:class:`xbob.io.base.Array` container: .. doctest:: - >>> xbob.io.save(t, 'copy2.hdf5') + >>> xbob.io.base.save(t, 'copy2.hdf5') .. note:: - Under the hood, we still use the :py:class:`xbob.io.File` API to execute + Under the hood, we still use the :py:class:`xbob.io.base.File` API to execute the read and write operations. Have a look at the manual section for - :py:mod:`xbob.io` for more details and other shortcuts available. + :py:mod:`xbob.io.base` for more details and other shortcuts available. Reading and writing images -------------------------- @@ -350,8 +355,8 @@ must be of type uint8 or uint16. .. doctest:: >>> my_image = numpy.random.random_integers(0,255,(3,256,256)) - >>> xbob.io.save(my_image.astype('uint8'), 'testimage.jpg') # saving the image in jpeg format - >>> my_image_copy = xbob.io.load('testimage.jpg') + >>> xbob.io.base.save(my_image.astype('uint8'), 'testimage.jpg') # saving the image in jpeg format + >>> my_image_copy = xbob.io.base.load('testimage.jpg') .. tip:: @@ -371,25 +376,25 @@ with images: .. doctest:: >>> my_video = numpy.random.random_integers(0,255,(30,3,256,256)) - >>> xbob.io.save(my_video.astype('uint8'), 'testvideo.avi') # saving the video avi format with a default codec - >>> my_video_copy = xbob.io.load('testvideo.avi') + >>> xbob.io.base.save(my_video.astype('uint8'), 'testvideo.avi') # saving the video avi format with a default codec + >>> my_video_copy = xbob.io.base.load('testvideo.avi') Video reading and writing is performed using an `FFmpeg`_ (or `libav`_ if -`FFmpeg`_ is not available) bridge. |project|'s :py:meth:`xbob.io.save` method -will allow you to choose the output format with the same extension mechanism as -mentioned earlier. `FFmpeg`_ will then choose a default codec for the format -and perform encoding. The output file can be as easily loaded using -:py:meth:`xbob.io.load`. +`FFmpeg`_ is not available) bridge. |project|'s :py:meth:`xbob.io.base.save` +method will allow you to choose the output format with the same extension +mechanism as mentioned earlier. `FFmpeg`_ will then choose a default codec for +the format and perform encoding. The output file can be as easily loaded using +:py:meth:`xbob.io.base.load`. For finer control over the loading, saving, format and codecs used for a specific encoding or decoding operation, you must directly use either -:py:class:`xbob.io.VideoReader` or :py:class:`xbob.io.VideoWriter` classes. For -example, it is possible to use :py:class:`xbob.io.VideoReader` to read videos -frame by frame and avoid overloading your machine's memory. In the following -example you can see how to create a video, save it using the class -:py:class:`xbob.io.VideoWriter` and load it again using the class -:py:class:`xbob.io.VideoReader`. The created video will have 30 frames -generated randomly. +:py:class:`xbob.io.base.VideoReader` or :py:class:`xbob.io.base.VideoWriter` +classes. For example, it is possible to use +:py:class:`xbob.io.base.VideoReader` to read videos frame by frame and avoid +overloading your machine's memory. In the following example you can see how to +create a video, save it using the class :py:class:`xbob.io.base.VideoWriter` +and load it again using the class :py:class:`xbob.io.base.VideoReader`. The +created video will have 30 frames generated randomly. .. note:: @@ -400,12 +405,12 @@ generated randomly. >>> width = 50; height = 50; >>> framerate = 24 - >>> outv = xbob.io.VideoWriter('testvideo.avi', height, width, framerate, codec='mpeg1video') # output video + >>> outv = xbob.io.base.VideoWriter('testvideo.avi', height, width, framerate, codec='mpeg1video') # output video >>> for i in range(0, 30): ... newframe = (numpy.random.random_integers(0,255,(3,height,width))) ... outv.append(newframe.astype('uint8')) >>> outv.close() - >>> input = xbob.io.VideoReader('testvideo.avi') + >>> input = xbob.io.base.VideoReader('testvideo.avi') >>> input.number_of_frames 30 >>> inv = input.load() @@ -434,12 +439,13 @@ in version of |project| installed on your machine can be listed using the Loading and saving Matlab data ------------------------------ -An alternative for saving data in ``.mat`` files using :py:meth:`xbob.io.save`, -would be to save them as a `HDF5`_ file which then can be easily read in -Matlab. Similarly, instead of having to read ``.mat`` files using -:py:meth:`xbob.io.load`, you can save your Matlab data in `HDF5`_ format, which -then can be easily read from |project|. Detailed instructions about how to save -and load data from Matlab to and from `HDF5`_ files can be found `here`__. +An alternative for saving data in ``.mat`` files using +:py:meth:`xbob.io.base.save`, would be to save them as a `HDF5`_ file which +then can be easily read in Matlab. Similarly, instead of having to read +``.mat`` files using :py:meth:`xbob.io.base.load`, you can save your Matlab +data in `HDF5`_ format, which then can be easily read from |project|. Detailed +instructions about how to save and load data from Matlab to and from `HDF5`_ +files can be found `here`__. .. _audiosignal: diff --git a/doc/index.rst b/doc/index.rst index 6e8985f..2372162 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,12 +1,12 @@ .. vim: set fileencoding=utf-8 : .. Andre Anjos <andre.anjos@idiap.ch> -.. Mon 4 Nov 20:58:04 2013 CET +.. Wed 14 May 15:22:33 2014 CEST .. -.. Copyright (C) 2011-2013 Idiap Research Institute, Martigny, Switzerland +.. Copyright (C) 2011-2014 Idiap Research Institute, Martigny, Switzerland -==================== - Bob's I/O Routines -==================== +========================= + Bob's Core I/O Routines +========================= .. todolist:: -- GitLab