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