From b0aa6650c766064448fd75d4fc88406240ec0925 Mon Sep 17 00:00:00 2001
From: Tiago Freitas Pereira <tiagofrepereira@gmail.com>
Date: Wed, 4 Mar 2015 18:59:52 +0100
Subject: [PATCH] Fixed bugs in my bug fix

---
 bob/learn/em/MAP_gmm_trainer.cpp | 10 +++++++-
 bob/learn/em/ML_gmm_trainer.cpp  | 42 +++++++++++++++++---------------
 2 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/bob/learn/em/MAP_gmm_trainer.cpp b/bob/learn/em/MAP_gmm_trainer.cpp
index caef230..cecfea9 100644
--- a/bob/learn/em/MAP_gmm_trainer.cpp
+++ b/bob/learn/em/MAP_gmm_trainer.cpp
@@ -29,7 +29,6 @@ static auto MAP_GMMTrainer_doc = bob::extension::ClassDoc(
   .add_prototype("prior_gmm,relevance_factor, update_means, [update_variances], [update_weights], [mean_var_update_responsibilities_threshold]","")
   .add_prototype("prior_gmm,alpha, update_means, [update_variances], [update_weights], [mean_var_update_responsibilities_threshold]","")
   .add_prototype("other","")
-  .add_prototype("","")
 
   .add_parameter("prior_gmm", ":py:class:`bob.learn.em.GMMMachine`", "The prior GMM to be adapted (Universal Backgroud Model UBM).")
   .add_parameter("reynolds_adaptation", "bool", "Will use the Reynolds adaptation procedure? See Eq (14) from [Reynolds2000]_")
@@ -122,6 +121,15 @@ static int PyBobLearnEMMAPGMMTrainer_init_base_trainer(PyBobLearnEMMAPGMMTrainer
 static int PyBobLearnEMMAPGMMTrainer_init(PyBobLearnEMMAPGMMTrainerObject* self, PyObject* args, PyObject* kwargs) {
   BOB_TRY
 
+  // get the number of command line arguments
+  int nargs = (args?PyTuple_Size(args):0) + (kwargs?PyDict_Size(kwargs):0);
+
+  if (nargs==0){
+    PyErr_Format(PyExc_RuntimeError, "number of arguments mismatch - %s (see help)", Py_TYPE(self)->tp_name);
+    MAP_GMMTrainer_doc.print_usage();
+    return -1;
+  }
+
   // If the constructor input is GMMBaseTrainer object
   if(PyBobLearnEMMAPGMMTrainer_Check(args))
     return PyBobLearnEMMAPGMMTrainer_init_copy(self, args, kwargs);
diff --git a/bob/learn/em/ML_gmm_trainer.cpp b/bob/learn/em/ML_gmm_trainer.cpp
index 1ba604e..f71b5d8 100644
--- a/bob/learn/em/ML_gmm_trainer.cpp
+++ b/bob/learn/em/ML_gmm_trainer.cpp
@@ -27,7 +27,6 @@ static auto ML_GMMTrainer_doc = bob::extension::ClassDoc(
   )
   .add_prototype("update_means, [update_variances], [update_weights], [mean_var_update_responsibilities_threshold]","")
   .add_prototype("other","")
-  .add_prototype("","")
 
   .add_parameter("update_means", "bool", "Update means on each iteration")
   .add_parameter("update_variances", "bool", "Update variances on each iteration")
@@ -62,7 +61,7 @@ static int PyBobLearnEMMLGMMTrainer_init_base_trainer(PyBobLearnEMMLGMMTrainerOb
   PyObject* update_weights   = Py_False;
   double mean_var_update_responsibilities_threshold = std::numeric_limits<double>::epsilon();
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O!O!d", kwlist, 
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O!O!O!d", kwlist, 
                                    &PyBool_Type, &update_means, 
                                    &PyBool_Type, &update_variances, 
                                    &PyBool_Type, &update_weights, 
@@ -81,24 +80,29 @@ static int PyBobLearnEMMLGMMTrainer_init_base_trainer(PyBobLearnEMMLGMMTrainerOb
 static int PyBobLearnEMMLGMMTrainer_init(PyBobLearnEMMLGMMTrainerObject* self, PyObject* args, PyObject* kwargs) {
   BOB_TRY
 
-  //Reading the input argument
-  PyObject* arg = 0;
-  if (PyTuple_Size(args))
-    arg = PyTuple_GET_ITEM(args, 0);
-  else {
-    PyObject* tmp = PyDict_Values(kwargs);
-    auto tmp_ = make_safe(tmp);
-    arg = PyList_GET_ITEM(tmp, 0);
+  // get the number of command line arguments
+  int nargs = (args?PyTuple_Size(args):0) + (kwargs?PyDict_Size(kwargs):0);
+
+  if (nargs==0)
+    return PyBobLearnEMMLGMMTrainer_init_base_trainer(self, args, kwargs); 
+  else{  
+
+    //Reading the input argument
+    PyObject* arg = 0;
+    if (PyTuple_Size(args))
+      arg = PyTuple_GET_ITEM(args, 0);
+    else {
+      PyObject* tmp = PyDict_Values(kwargs);
+      auto tmp_ = make_safe(tmp);
+      arg = PyList_GET_ITEM(tmp, 0);
+    }
+    
+    // If the constructor input is GMMBaseTrainer object
+    if (PyBobLearnEMMLGMMTrainer_Check(arg))
+      return PyBobLearnEMMLGMMTrainer_init_copy(self, args, kwargs);
+    else
+      return PyBobLearnEMMLGMMTrainer_init_base_trainer(self, args, kwargs);
   }
-
-  // If the constructor input is GMMBaseTrainer object
-  if (PyBobLearnEMMLGMMTrainer_Check(arg))
-    return PyBobLearnEMMLGMMTrainer_init_copy(self, args, kwargs);
-  else
-    return PyBobLearnEMMLGMMTrainer_init_base_trainer(self, args, kwargs);
-
-
-
   BOB_CATCH_MEMBER("cannot create GMMBaseTrainer_init_bool", 0)
   return 0;
 }
-- 
GitLab