From 1ca8060bf7d23a5746b6b8a9c9356385a4e81609 Mon Sep 17 00:00:00 2001 From: Andre Anjos <andre.anjos@idiap.ch> Date: Tue, 14 Jan 2014 10:09:59 +0100 Subject: [PATCH] Add documentation; Definitions --- doc/c_cpp_api.rst | 49 ++++++-- xbob/machine/__init__.py | 4 +- xbob/machine/activation.cpp | 2 +- xbob/machine/identity_activation.cpp | 9 +- xbob/machine/include/xbob.machine/api.h | 150 +++++++++++++++++++++++- xbob/machine/linear_activation.cpp | 9 +- xbob/machine/logistic_activation.cpp | 9 +- xbob/machine/main.cpp | 69 ++++++++++- xbob/machine/mult_tanh_activation.cpp | 9 +- xbob/machine/tanh_activation.cpp | 9 +- 10 files changed, 265 insertions(+), 54 deletions(-) diff --git a/doc/c_cpp_api.rst b/doc/c_cpp_api.rst index f047fa2..10ef594 100644 --- a/doc/c_cpp_api.rst +++ b/doc/c_cpp_api.rst @@ -45,23 +45,58 @@ the import function: The include directory can be discovered using :py:func:`xbob.machine.get_include`. -Activation Support ------------------- +Activation Functors +------------------- .. cpp:type:: PyBobMachineActivationObject The pythonic object representation for a ``bob::machine::Activation`` - object. + object. It is the base class of all activation functors available in + |project|. In C/C++ code, we recommend you only manipulate objects like this + to keep your code agnostic to the activation type being used. .. code-block:: cpp typedef struct { PyObject_HEAD - boost::shared_ptr<bob::machine::Activation> a; - } PyBobIoFileObject; + bob::machine::Activation* base; + } PyBobMachineActivationObject; - .. cpp:member:: boost::shared_ptr<bob::machine::Activation> a + .. cpp:member:: bob::machine::Activation* base - A pointer to the activation function implementation + A pointer to the activation functor virtual implementation. + + +.. cpp:function:: int PyBobMachineActivation_Check(PyObject* o) + + Checks if the input object ``o`` is a ``PyBobMachineActivationObject``. + Returns ``1`` if it is, and ``0`` otherwise. + + +.. note:: + + Other object definitions exist for each of the specializations for + activation functors found in |project|. They are exported through the module + C-API, but we don't recommend using them since you'd loose generality. In + case you do absolutely need to use any of these derivations, they have all + the same object configuration: + + .. code-block:: c++ + + typedef struct { + PyBobMachineActivationObject parent; + bob::machine::<Subtype>Activation* base; + } PyBobMachine<Subtype>ActivationObject; + + Presently, ``<Subtype>`` can be one of: + + * Identity + * Linear + * Logistic + * HyperbolicTangent + * MultipliedHyperbolicTangent + + Type objects are also named consistently like + ``PyBobMachine<Subtype>_Type``. .. include:: links.rst diff --git a/xbob/machine/__init__.py b/xbob/machine/__init__.py index a4f0d18..2f37f43 100644 --- a/xbob/machine/__init__.py +++ b/xbob/machine/__init__.py @@ -1,7 +1,7 @@ from ._library import * -from . import __linear__ -from . import __mlp__ +#from . import __linear__ +#from . import __mlp__ def ztnorm_same_value(vect_a, vect_b): """Computes the matrix of boolean D for the ZT-norm, which indicates where diff --git a/xbob/machine/activation.cpp b/xbob/machine/activation.cpp index 7acb1fa..40811f2 100644 --- a/xbob/machine/activation.cpp +++ b/xbob/machine/activation.cpp @@ -500,7 +500,7 @@ static PyMethodDef PyBobMachineActivation_methods[] = { {0} /* Sentinel */ }; -static int PyBobMachineActivation_Check(PyObject* o) { +int PyBobMachineActivation_Check(PyObject* o) { return PyObject_IsInstance(o, reinterpret_cast<PyObject*>(&PyBobMachineActivation_Type)); } diff --git a/xbob/machine/identity_activation.cpp b/xbob/machine/identity_activation.cpp index 56fa88e..ce5849a 100644 --- a/xbob/machine/identity_activation.cpp +++ b/xbob/machine/identity_activation.cpp @@ -5,6 +5,7 @@ * @brief Implementation of the Identity Activation function */ +#define XBOB_MACHINE_MODULE #include <xbob.machine/api.h> PyDoc_STRVAR(s_identityactivation_str, @@ -17,14 +18,6 @@ Computes :math:`f(z) = z` as activation function.\n\ \n\ "); -typedef struct { - PyBobMachineActivationObject parent; - - /* Type-specific fields go here. */ - bob::machine::IdentityActivation* base; - -} PyBobMachineIdentityActivationObject; - static int PyBobMachineIdentityActivation_init (PyBobMachineIdentityActivationObject* self, PyObject* args, PyObject* kwds) { diff --git a/xbob/machine/include/xbob.machine/api.h b/xbob/machine/include/xbob.machine/api.h index 4cecbcd..c450c30 100644 --- a/xbob/machine/include/xbob.machine/api.h +++ b/xbob/machine/include/xbob.machine/api.h @@ -42,8 +42,92 @@ typedef struct { #define PyBobMachineActivation_Type_NUM 1 #define PyBobMachineActivation_Type_TYPE PyTypeObject +#define PyBobMachineActivation_Check_NUM 2 +#define PyBobMachineActivation_Check_RET int +#define PyBobMachineActivation_Check_PROTO (PyObject* o) + +/******************************************* + * Bindings for xbob.io.IdentityActivation * + *******************************************/ + +/* Type definition for PyBobMachineIdentityActivationObject */ +typedef struct { + PyBobMachineActivationObject parent; + + /* Type-specific fields go here. */ + bob::machine::IdentityActivation* base; + +} PyBobMachineIdentityActivationObject; + +#define PyBobMachineIdentityActivation_Type_NUM 3 +#define PyBobMachineIdentityActivation_Type_TYPE PyTypeObject + +/***************************************** + * Bindings for xbob.io.LinearActivation * + *****************************************/ + +/* Type definition for PyBobMachineLinearActivationObject */ +typedef struct { + PyBobMachineActivationObject parent; + + /* Type-specific fields go here. */ + bob::machine::LinearActivation* base; + +} PyBobMachineLinearActivationObject; + +#define PyBobMachineLinearActivation_Type_NUM 4 +#define PyBobMachineLinearActivation_Type_TYPE PyTypeObject + +/******************************************* + * Bindings for xbob.io.LogisticActivation * + *******************************************/ + +/* Type definition for PyBobMachineLogisticActivationObject */ +typedef struct { + PyBobMachineActivationObject parent; + + /* Type-specific fields go here. */ + bob::machine::LogisticActivation* base; + +} PyBobMachineLogisticActivationObject; + +#define PyBobMachineLogisticActivation_Type_NUM 5 +#define PyBobMachineLogisticActivation_Type_TYPE PyTypeObject + +/**************************************************** + * Bindings for xbob.io.HyperbolicTangentActivation * + ****************************************************/ + +/* Type definition for PyBobMachineHyperbolicTangentActivationObject */ +typedef struct { + PyBobMachineActivationObject parent; + + /* Type-specific fields go here. */ + bob::machine::HyperbolicTangentActivation* base; + +} PyBobMachineHyperbolicTangentActivationObject; + +#define PyBobMachineHyperbolicTangentActivation_Type_NUM 6 +#define PyBobMachineHyperbolicTangentActivation_Type_TYPE PyTypeObject + +/************************************************************** + * Bindings for xbob.io.MultipliedHyperbolicTangentActivation * + **************************************************************/ + +/* Type definition: PyBobMachineMultipliedHyperbolicTangentActivationObject */ +typedef struct { + PyBobMachineActivationObject parent; + + /* Type-specific fields go here. */ + bob::machine::MultipliedHyperbolicTangentActivation* base; + +} PyBobMachineMultipliedHyperbolicTangentActivationObject; + +#define PyBobMachineMultipliedHyperbolicTangentActivation_Type_NUM 7 +#define PyBobMachineMultipliedHyperbolicTangentActivation_Type_TYPE PyTypeObject + /* Total number of C API pointers */ -#define PyXbobMachine_API_pointers 2 +#define PyXbobMachine_API_pointers 8 #ifdef XBOB_MACHINE_MODULE @@ -61,6 +145,38 @@ typedef struct { extern PyBobMachineActivation_Type_TYPE PyBobMachineActivation_Type; + PyBobMachineActivation_Check_RET PyBobMachineActivation_Check PyBobMachineActivation_Check_PROTO; + + /******************************************* + * Bindings for xbob.io.IdentityActivation * + *******************************************/ + + extern PyBobMachineIdentityActivation_Type_TYPE PyBobMachineIdentityActivation_Type; + + /***************************************** + * Bindings for xbob.io.LinearActivation * + *****************************************/ + + extern PyBobMachineLinearActivation_Type_TYPE PyBobMachineLinearActivation_Type; + + /******************************************* + * Bindings for xbob.io.LogisticActivation * + *******************************************/ + + extern PyBobMachineLogisticActivation_Type_TYPE PyBobMachineLogisticActivation_Type; + + /**************************************************** + * Bindings for xbob.io.HyperbolicTangentActivation * + ****************************************************/ + + extern PyBobMachineHyperbolicTangentActivation_Type_TYPE PyBobMachineHyperbolicTangentActivation_Type; + + /************************************************************** + * Bindings for xbob.io.MultipliedHyperbolicTangentActivation * + **************************************************************/ + + extern PyBobMachineMultipliedHyperbolicTangentActivation_Type_TYPE PyBobMachineMultipliedHyperbolicTangentActivation_Type; + #else /* This section is used in modules that use `blitz.array's' C-API */ @@ -99,6 +215,38 @@ typedef struct { # define PyBobMachineActivation_Type (*(PyBobMachineActivation_Type_TYPE *)PyXbobMachine_API[PyBobMachineActivation_Type_NUM]) +# define PyBobMachineActivation_Check (*(PyBobMachineActivation_Check_RET (*)PyBobMachineActivation_Check_PROTO) PyXbobMachine_API[PyBobMachineActivation_Check_NUM]) + + /************************************************ + * Bindings for xbob.machine.IdentityActivation * + ************************************************/ + +# define PyBobMachineIdentityActivation_Type (*(PyBobMachineIdentityActivation_Type_TYPE *)PyXbobMachine_API[PyBobMachineIdentityActivation_Type_NUM]) + + /********************************************** + * Bindings for xbob.machine.LinearActivation * + **********************************************/ + +# define PyBobMachineLinearActivation_Type (*(PyBobMachineLinearActivation_Type_TYPE *)PyXbobMachine_API[PyBobMachineLinearActivation_Type_NUM]) + + /************************************************ + * Bindings for xbob.machine.LogisticActivation * + ************************************************/ + +# define PyBobMachineLogisticActivation_Type (*(PyBobMachineLogisticActivation_Type_TYPE *)PyXbobMachine_API[PyBobMachineLogisticActivation_Type_NUM]) + + /********************************************************* + * Bindings for xbob.machine.HyperbolicTangentActivation * + *********************************************************/ + +# define PyBobMachineHyperbolicTangentActivation_Type (*(PyBobMachineHyperbolicTangentActivation_Type_TYPE *)PyXbobMachine_API[PyBobMachineHyperbolicTangentActivation_Type_NUM]) + + /******************************************************************* + * Bindings for xbob.machine.MultipliedHyperbolicTangentActivation * + *******************************************************************/ + +# define PyBobMachineMultipliedHyperbolicTangentActivation_Type (*(PyBobMachineMultipliedHyperbolicTangentActivation_Type_TYPE *)PyXbobMachine_API[PyBobMachineMultipliedHyperbolicTangentActivation_Type_NUM]) + # if !defined(NO_IMPORT_ARRAY) /** diff --git a/xbob/machine/linear_activation.cpp b/xbob/machine/linear_activation.cpp index 3c43316..c2919a8 100644 --- a/xbob/machine/linear_activation.cpp +++ b/xbob/machine/linear_activation.cpp @@ -5,6 +5,7 @@ * @brief Implementation of the Linear Activation function */ +#define XBOB_MACHINE_MODULE #include <xbob.machine/api.h> PyDoc_STRVAR(s_linearactivation_str, @@ -21,14 +22,6 @@ set constant to the default value (1.0). In such a case,\n\ prefer to use the more efficient :py:class:`IdentityActivation`.\n\ "); -typedef struct { - PyBobMachineActivationObject parent; - - /* Type-specific fields go here. */ - bob::machine::LinearActivation* base; - -} PyBobMachineLinearActivationObject; - static int PyBobMachineLinearActivation_init (PyBobMachineLinearActivationObject* self, PyObject* args, PyObject* kwds) { diff --git a/xbob/machine/logistic_activation.cpp b/xbob/machine/logistic_activation.cpp index 8a5e669..d1ff0df 100644 --- a/xbob/machine/logistic_activation.cpp +++ b/xbob/machine/logistic_activation.cpp @@ -5,6 +5,7 @@ * @brief Implementation of the Logistic Activation function */ +#define XBOB_MACHINE_MODULE #include <xbob.machine/api.h> PyDoc_STRVAR(s_logisticactivation_str, @@ -17,14 +18,6 @@ Computes :math:`f(z) = 1/(1+ e^{-z})` as activation function.\n\ \n\ "); -typedef struct { - PyBobMachineActivationObject parent; - - /* Type-specific fields go here. */ - bob::machine::LogisticActivation* base; - -} PyBobMachineLogisticActivationObject; - static int PyBobMachineLogisticActivation_init (PyBobMachineLogisticActivationObject* self, PyObject* args, PyObject* kwds) { diff --git a/xbob/machine/main.cpp b/xbob/machine/main.cpp index 3750fe6..8730a65 100644 --- a/xbob/machine/main.cpp +++ b/xbob/machine/main.cpp @@ -27,6 +27,22 @@ PyMODINIT_FUNC XBOB_EXT_ENTRY_NAME (void) { PyBobMachineActivation_Type.tp_new = PyType_GenericNew; if (PyType_Ready(&PyBobMachineActivation_Type) < 0) return; + PyBobMachineIdentityActivation_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&PyBobMachineIdentityActivation_Type) < 0) return; + + PyBobMachineLinearActivation_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&PyBobMachineLinearActivation_Type) < 0) return; + + PyBobMachineLogisticActivation_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&PyBobMachineLogisticActivation_Type) < 0) return; + + PyBobMachineHyperbolicTangentActivation_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&PyBobMachineHyperbolicTangentActivation_Type) < 0) return; + + PyBobMachineMultipliedHyperbolicTangentActivation_Type.tp_new = + PyType_GenericNew; + if (PyType_Ready(&PyBobMachineMultipliedHyperbolicTangentActivation_Type) < 0) return; + PyObject* m = Py_InitModule3(XBOB_EXT_MODULE_NAME, library_methods, library_docstr); /* register some constants */ @@ -37,6 +53,21 @@ PyMODINIT_FUNC XBOB_EXT_ENTRY_NAME (void) { Py_INCREF(&PyBobMachineActivation_Type); PyModule_AddObject(m, "Activation", (PyObject *)&PyBobMachineActivation_Type); + Py_INCREF(&PyBobMachineIdentityActivation_Type); + PyModule_AddObject(m, "IdentityActivation", (PyObject *)&PyBobMachineIdentityActivation_Type); + + Py_INCREF(&PyBobMachineLinearActivation_Type); + PyModule_AddObject(m, "LinearActivation", (PyObject *)&PyBobMachineLinearActivation_Type); + + Py_INCREF(&PyBobMachineLogisticActivation_Type); + PyModule_AddObject(m, "LogisticActivation", (PyObject *)&PyBobMachineLogisticActivation_Type); + + Py_INCREF(&PyBobMachineHyperbolicTangentActivation_Type); + PyModule_AddObject(m, "HyperbolicTangentActivation", (PyObject *)&PyBobMachineHyperbolicTangentActivation_Type); + + Py_INCREF(&PyBobMachineMultipliedHyperbolicTangentActivation_Type); + PyModule_AddObject(m, "MultipliedHyperbolicTangentActivation", (PyObject *)&PyBobMachineMultipliedHyperbolicTangentActivation_Type); + static void* PyXbobMachine_API[PyXbobMachine_API_pointers]; /* exhaustive list of C APIs */ @@ -47,12 +78,44 @@ PyMODINIT_FUNC XBOB_EXT_ENTRY_NAME (void) { PyXbobMachine_API[PyXbobMachine_APIVersion_NUM] = (void *)&PyXbobMachine_APIVersion; - /***************************** - * Bindings for xbob.io.file * - *****************************/ + /**************************************** + * Bindings for xbob.machine.Activation * + ****************************************/ PyXbobMachine_API[PyBobMachineActivation_Type_NUM] = (void *)&PyBobMachineActivation_Type; + PyXbobMachine_API[PyBobMachineActivation_Check_NUM] = (void *)&PyBobMachineActivation_Check; + + /************************************************ + * Bindings for xbob.machine.IdentityActivation * + ************************************************/ + + PyXbobMachine_API[PyBobMachineIdentityActivation_Type_NUM] = (void *)&PyBobMachineIdentityActivation_Type; + + /********************************************** + * Bindings for xbob.machine.LinearActivation * + **********************************************/ + + PyXbobMachine_API[PyBobMachineLinearActivation_Type_NUM] = (void *)&PyBobMachineLinearActivation_Type; + + /************************************************ + * Bindings for xbob.machine.LogisticActivation * + ************************************************/ + + PyXbobMachine_API[PyBobMachineLogisticActivation_Type_NUM] = (void *)&PyBobMachineLogisticActivation_Type; + + /********************************************************* + * Bindings for xbob.machine.HyperbolicTangentActivation * + *********************************************************/ + + PyXbobMachine_API[PyBobMachineHyperbolicTangentActivation_Type_NUM] = (void *)&PyBobMachineHyperbolicTangentActivation_Type; + + /******************************************************************* + * Bindings for xbob.machine.MultipliedHyperbolicTangentActivation * + *******************************************************************/ + + PyXbobMachine_API[PyBobMachineMultipliedHyperbolicTangentActivation_Type_NUM] = (void *)&PyBobMachineMultipliedHyperbolicTangentActivation_Type; + #if PY_VERSION_HEX >= 0x02070000 /* defines the PyCapsule */ diff --git a/xbob/machine/mult_tanh_activation.cpp b/xbob/machine/mult_tanh_activation.cpp index 92e67a5..c06ada6 100644 --- a/xbob/machine/mult_tanh_activation.cpp +++ b/xbob/machine/mult_tanh_activation.cpp @@ -5,6 +5,7 @@ * @brief Implementation of the MultipliedHyperbolicTangent Activation function */ +#define XBOB_MACHINE_MODULE #include <xbob.machine/api.h> PyDoc_STRVAR(s_multtanhactivation_str, @@ -23,14 +24,6 @@ such a case, prefer to use the more efficient\n\ :py:class:`bob.machine.HyperbolicTangentActivation`.\n\ "); -typedef struct { - PyBobMachineActivationObject parent; - - /* Type-specific fields go here. */ - bob::machine::MultipliedHyperbolicTangentActivation* base; - -} PyBobMachineMultipliedHyperbolicTangentActivationObject; - static int PyBobMachineMultipliedHyperbolicTangentActivation_init (PyBobMachineMultipliedHyperbolicTangentActivationObject* self, PyObject* args, PyObject* kwds) { diff --git a/xbob/machine/tanh_activation.cpp b/xbob/machine/tanh_activation.cpp index 1a05363..978277e 100644 --- a/xbob/machine/tanh_activation.cpp +++ b/xbob/machine/tanh_activation.cpp @@ -5,6 +5,7 @@ * @brief Implementation of the HyperbolicTangent Activation function */ +#define XBOB_MACHINE_MODULE #include <xbob.machine/api.h> PyDoc_STRVAR(s_hyperbolictangentactivation_str, @@ -17,14 +18,6 @@ Computes :math:`f(z) = \\tanh(z)` as activation function.\n\ \n\ "); -typedef struct { - PyBobMachineActivationObject parent; - - /* Type-specific fields go here. */ - bob::machine::HyperbolicTangentActivation* base; - -} PyBobMachineHyperbolicTangentActivationObject; - static int PyBobMachineHyperbolicTangentActivation_init (PyBobMachineHyperbolicTangentActivationObject* self, PyObject* args, PyObject* kwds) { -- GitLab