[mlpack-svn] r10669 - in mlpack/trunk/src/mlpack: core/io core/utilities methods/emst methods/gmm methods/hmm methods/kmeans methods/linear_regression methods/naive_bayes methods/nca methods/neighbor_search methods/pca tests

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Thu Dec 8 14:01:43 EST 2011


Author: mamidon
Date: 2011-12-08 14:01:43 -0500 (Thu, 08 Dec 2011)
New Revision: 10669

Modified:
   mlpack/trunk/src/mlpack/core/io/cli.cpp
   mlpack/trunk/src/mlpack/core/io/cli.hpp
   mlpack/trunk/src/mlpack/core/io/cli_impl.hpp
   mlpack/trunk/src/mlpack/core/io/option.cpp
   mlpack/trunk/src/mlpack/core/io/option.hpp
   mlpack/trunk/src/mlpack/core/io/option_impl.hpp
   mlpack/trunk/src/mlpack/core/utilities/timers.cpp
   mlpack/trunk/src/mlpack/methods/emst/emst_main.cpp
   mlpack/trunk/src/mlpack/methods/gmm/gmm_main.cpp
   mlpack/trunk/src/mlpack/methods/hmm/generate.cpp
   mlpack/trunk/src/mlpack/methods/hmm/train.cpp
   mlpack/trunk/src/mlpack/methods/kmeans/kmeans_main.cpp
   mlpack/trunk/src/mlpack/methods/linear_regression/linear_regression_main.cpp
   mlpack/trunk/src/mlpack/methods/naive_bayes/nbc_main.cpp
   mlpack/trunk/src/mlpack/methods/nca/nca_main.cpp
   mlpack/trunk/src/mlpack/methods/neighbor_search/allkfn_main.cpp
   mlpack/trunk/src/mlpack/methods/neighbor_search/allknn_main.cpp
   mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
   mlpack/trunk/src/mlpack/methods/pca/pca_main.cpp
   mlpack/trunk/src/mlpack/tests/cli_test.cpp
   mlpack/trunk/src/mlpack/tests/gmm_test.cpp
   mlpack/trunk/src/mlpack/tests/lbfgs_test.cpp
Log:
Reimplemented CLI w/o heirarchy.  
Eliminated concept of modules from CLI and main functions.
So if it was foo/bar before, it will now be just bar.

Will continue formatting CLI help/info/verbose.



Modified: mlpack/trunk/src/mlpack/core/io/cli.cpp
===================================================================
--- mlpack/trunk/src/mlpack/core/io/cli.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/io/cli.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -40,7 +40,7 @@
 namespace po = boost::program_options;
 
 // Fake ProgramDoc in case none is supplied.
-static ProgramDoc empty_program_doc = ProgramDoc("", "", "");
+static ProgramDoc empty_program_doc = ProgramDoc("", "");
 
 /* Constructors, Destructors, Copy */
 /* Make the constructor private, to preclude unauthorized instances */
@@ -75,17 +75,17 @@
 
   // Did the user ask for verbose output?  If so we need to print everything.
   // But only if the user did not ask for help or info.
-  if (GetParam<bool>("verbose"))
+  if (HasParam("verbose"))
   {
     Log::Info << "Execution parameters:" << std::endl;
-    //hierarchy.PrintLeaves(), todo replace functionality;
+    Print();
 
     Log::Info << "Program timers:" << std::endl;
     std::map<std::string, timeval> times = Timers::GetAllTimers();
     std::map<std::string, timeval>::iterator iter;
     for (iter = times.begin(); iter != times.end(); iter++)
     {
-      Log::Info << "  " << iter->first << ": ";
+      Log::Info << "\t" << iter->first << ": ";
       Timers::PrintTimer(iter->first.c_str());
     }
   }
@@ -107,24 +107,43 @@
  *
  * @param identifier The name of the parameter.
  * @param description Short string description of the parameter.
- * @param parent Full pathname of a parent module, default is root node.
+ * @param alias An alias for the parameter.
  * @param required Indicates if parameter must be set on command line.
  */
 void CLI::Add(const char* identifier,
              const char* description,
-             const char* parent,
+             const char* alias,
              bool required)
 {
   po::options_description& desc = CLI::GetSingleton().desc;
 
-  // Generate the full pathname and insert the node into the hierarchy.
   std::string tmp = TYPENAME(bool);
   std::string path = identifier;
+  std::string stringAlias = alias;
+  std::string prog_opt_id = path; //Use boost's syntax for aliasing.
 
-  // Add the option to boost::program_options.
+  //deal with a required alias
+  if (stringAlias.length()) {
+    amap_t& amap = GetSingleton().aliasValues;
+    amap[stringAlias] = path;
+    prog_opt_id = path + "," + alias;
+  }
+
+  //Add the option to boost::program_options.
   desc.add_options()
-    (path.c_str(), description);
+    (prog_opt_id.c_str(), description);
 
+  //Make sure the description etc ends up in gmap
+  gmap_t& gmap = GetSingleton().globalValues;
+  ParamData data;
+  data.desc = description;
+  data.tname = "";
+  data.name = path;
+  data.isFlag = false;
+  data.wasPassed = false;
+
+  gmap[path] = data;
+
   // If the option is required, add it to the required options list.
   if (required)
     GetSingleton().requiredOptions.push_front(path);
@@ -137,16 +156,35 @@
  */
 void CLI::AddFlag(const char* identifier,
                  const char* description,
-                 const char* parent)
+                 const char* alias)
 {
   po::options_description& desc = CLI::GetSingleton().desc;
 
-  //Generate the full pathname and insert node into the hierarchy
   std::string path = identifier;
+  std::string stringAlias = alias;
+  std::string prog_opt_id = path;
 
+  //Deal with a required alias
+  if (stringAlias.length()) {
+    amap_t& amap = GetSingleton().aliasValues;
+    amap[stringAlias] = path;
+    prog_opt_id = path + "," + alias;
+  }
+
   // Add the option to boost::program_options.
   desc.add_options()
-    (path.c_str(), po::value<bool>()->implicit_value(true), description);
+    (prog_opt_id.c_str(), po::value<bool>()->implicit_value(true), description);
+
+  // Add the proper metadata in gmap.
+  gmap_t& gmap = GetSingleton().globalValues;
+  ParamData data;
+  data.desc = description;
+  data.tname = TYPENAME(bool);
+  data.name = path;
+  data.isFlag = true;
+  data.wasPassed = false;
+
+  gmap[path] = data;
 }
 
 /**
@@ -157,19 +195,24 @@
 bool CLI::HasParam(const char* identifier)
 {
   po::variables_map vmap = GetSingleton().vmap;
-  gmap_t gmap = GetSingleton().globalValues;
-  std::string key = std::string(identifier);
+  gmap_t& gmap = GetSingleton().globalValues;
+  std::string key = identifier;
 
+  //Take any possible alias into account
+  amap_t& amap = GetSingleton().aliasValues;  
+  if (amap.count(key))
+    key = amap[key]; 
+
   //Does the parameter exist at all?
-  //int isInVmap = vmap.count(key);
   int isInGmap = gmap.count(key);
 
   // Check if the parameter is boolean; if it is, we just want to see if it was
-  // passed at program initiation.
-  // TODO, reimpliment flag logic.
+  if(isInGmap && gmap[key].isFlag) 
+    return gmap[key].wasPassed;
   
+  
   // Return true if we have a defined value for identifier.
-  return isInGmap;
+  return isInGmap != 0;
 }
 
 /**
@@ -180,9 +223,15 @@
  */
 std::string CLI::GetDescription(const char* identifier)
 {
-  gmap_t gmap = GetSingleton().globalValues;
+  gmap_t& gmap = GetSingleton().globalValues;
   std::string name = std::string(identifier);
 
+  //Take any possible alias into account
+  amap_t& amap = GetSingleton().aliasValues;
+  if (amap.count(name))
+    name = amap[name]; 
+
+
   if(gmap.count(name))
     return gmap[name].desc;
   else
@@ -267,17 +316,18 @@
   gmap_t& gmap = GetSingleton().globalValues;
   po::variables_map& vmap = GetSingleton().vmap;
 
-  // Iterate through Gmap, and overwrite default values with anything found on
+  // Iterate through vmap, and overwrite default values with anything found on
   // command line.
-  gmap_t::iterator i;
-  for (i = gmap.begin(); i != gmap.end(); i++)
+  po::variables_map::iterator i;
+  for (i = vmap.begin(); i != vmap.end(); i++)
   {
-    po::variable_value tmp = vmap[i->first];
-    if (!tmp.empty()){ // We need to overwrite gmap.
-      ParamData param;
-      param.value = tmp.value();
-      gmap[i->first] = param;
-    }
+    ParamData param;
+    if (gmap.count(i->first)) // We need to preserve certain data
+      param = gmap[i->first];
+
+    param.value = vmap[i->first].value();
+    param.wasPassed = true;
+    gmap[i->first] = param;
   }
 }
 
@@ -319,28 +369,20 @@
   // Default help message
   if (GetParam<bool>("help"))
   {
-    // A little snippet about the program itself, if we have it.
-    if (GetSingleton().doc != &empty_program_doc)
-    {
-      std::cout << GetSingleton().doc->programName << std::endl << std::endl;
-    }
-    Log::Fatal << "TODO: reimpliment printing functionality" << std::endl;
+    Log::Info.ignoreInput = false;
+    PrintHelp();
     exit(0); // The user doesn't want to run the program, he wants help.
   }
 
   if (HasParam("info"))
   {
+    Log::Info.ignoreInput = false;
     std::string str = GetParam<std::string>("info");
     // The info node should always be there, but the user may not have specified
     // anything.
     if (str != "")
     {
-      Log::Fatal << "TODO: Reimpliment printing functionality" << std::endl;
-     /* //OptionsHierarchy* node = GetSingleton().hierarchy.FindNode(str);
-      if(node != NULL)
-        //node->PrintNodeHelp();
-      else
-        Log::Fatal << "Invalid parameter: " << str << std::endl;*/
+      PrintHelp(str);
       exit(0);
     }
   }
@@ -379,9 +421,150 @@
 /* Prints out the current hierarchy. */
 void CLI::Print()
 {
-  Log::Fatal << "TODO: Reimpliment printing functionality" << std::endl;
+  gmap_t& gmap = GetSingleton().globalValues;
+  gmap_t::iterator iter;
+
+  // Print out all the values.
+  Log::Info << std::endl << "Values: " << std::endl;
+  for(iter = gmap.begin(); iter != gmap.end(); iter++) {
+    std::string key = iter->first;
+    std::string alias = AliasReverseLookup(key);
+    alias = alias.length() ? ", " + alias : alias;
+
+    Log::Info << "\t" << key << alias << " : ";
+
+    //Now, figure out what type it is, and print it.
+    //We can handle strings, ints, bools, floats, doubles.
+    ParamData data = iter->second;
+    if (data.tname == TYPENAME(std::string)) {
+      std::string value = GetParam<std::string>(key.c_str());
+      if(value == "")
+        Log::Info << "\" \"";
+      Log::Info << value;
+    } else if (data.tname == TYPENAME(int)) {
+      int value = GetParam<int>(key.c_str());
+      Log::Info << value;
+    } else if (data.tname == TYPENAME(bool)) {
+      bool value = HasParam(key.c_str());
+      Log::Info << (value ? "True" : "False");
+    } else if (data.tname == TYPENAME(float)) {
+      float value = GetParam<float>(key.c_str());
+      Log::Info << value;
+    } else if (data.tname == TYPENAME(double)) {
+      double value = GetParam<double>(key.c_str());
+      Log::Info << value;
+    } else { 
+      //We don't know how to print this, or it's a timeval which
+      //is printed later.
+      Log::Info << "Unknown Data Type";
+    }
+
+    Log::Info << std::endl;
+  }
+  Log::Info << std::endl;
 }
 
+
+/* Prints the descriptions of the current hierarchy. */
+void CLI::PrintHelp(std::string param)
+{
+  gmap_t& gmap = GetSingleton().globalValues;
+  amap_t& amap = GetSingleton().aliasValues;
+  gmap_t::iterator iter;
+  ProgramDoc docs = *GetSingleton().doc;
+  
+  // If we pass a single param, alias it if necessary
+  if(param != "" && amap.count(param))
+    param = amap[param];
+  
+  // Do we only want to print out one value?
+  if (param != "" && gmap.count(param)) {
+    ParamData data = gmap[param];
+    std::string alias = AliasReverseLookup(param);
+    alias = alias.length() ? ", "+alias:alias; 
+     
+    Log::Info << param << alias << " info: " << std::endl;
+    Log::Info << "\t" << HyphenateString(data.desc, 8) << std::endl;
+    return;
+  } else if(param != "") {
+    //User passed a single variable, but it doesn't exist.
+    Log::Info << "Parameter does not exist." << std::endl;
+  }
+
+  // Print out the descriptions.
+  if(docs.programName != "") {
+    Log::Info << "Program: " << docs.programName << std::endl;
+    Log::Info << "\t" << HyphenateString(docs.documentation,8) << std::endl;
+  }
+  else
+    Log::Info << "Undocumented Program" << std::endl;
+
+  Log::Info << "Parameter Info: " << std::endl;
+  // Print out the descriptions of everything else.
+  for(iter = gmap.begin(); iter != gmap.end(); iter++) {
+    std::string key = iter->first;
+    ParamData data = iter->second;
+    std::string desc = data.desc;
+    std::string alias = AliasReverseLookup(key);
+    alias = alias.length() ? ", "+alias:alias;
+
+    //Now, print the descriptions.
+    Log::Info << "\t" << key << alias << std::endl;
+    Log::Info << "\t\t" << HyphenateString(desc,16) << std::endl;
+    Log::Info << std::endl;
+  }
+ 
+}
+
+/**
+ * Hyphenate a string or split it onto multiple 80-character lines, with some
+ * amount of padding on each line.  This is used for option output.
+ *
+ * @param str String to hyphenate (splits are on ' ').
+ * @param padding Amount of padding on the left for each new line.
+ */
+std::string CLI::HyphenateString(std::string str, int padding) {
+  size_t margin = 80 - padding;
+  if (str.length() < margin)
+    return str;
+  std::string out("");
+  unsigned int pos = 0;
+  // First try to look as far as possible.
+  while(pos < str.length() - 1) {
+    size_t splitpos;
+    // Check that we don't have a newline first.
+    splitpos = str.find('\n', pos);
+    if (splitpos == std::string::npos || splitpos > (pos + margin)) {
+      // We did not find a newline.
+      if (str.length() - pos < margin) {
+        splitpos = str.length(); // The rest fits on one line.
+      } else {
+      splitpos = str.rfind(' ', margin + pos); // Find nearest space.
+      if (splitpos <= pos || splitpos == std::string::npos) // Not found.
+        splitpos = pos + margin;
+      }
+    }
+    out += str.substr(pos, (splitpos - pos));
+    if (splitpos < str.length()) {
+      out += '\n';
+      out += std::string(padding, ' ');
+    }
+    pos = splitpos;
+  if (str[pos] == ' ' || str[pos] == '\n')
+  pos++;
+  }
+  return out;
+} 
+
+std::string CLI::AliasReverseLookup(std::string value) {
+  amap_t& amap = GetSingleton().aliasValues;
+  amap_t::iterator iter;
+  for(iter = amap.begin(); iter != amap.end(); iter++)
+    if(iter->second == value) //Found our match
+      return iter->first; 
+  return ""; 
+}
+
 // Add help parameter.
 PARAM_FLAG("help", "Default help info.", "");
 PARAM_STRING("info", "Get help on a specific module or option.", "", "");

Modified: mlpack/trunk/src/mlpack/core/io/cli.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/io/cli.hpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/io/cli.hpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -20,18 +20,10 @@
 #include "cli_deleter.hpp" // To make sure we can delete the singleton.
 
 /**
- * Document an executable and set a default module.  Only one
- * instance of this macro should be present in your program!  Therefore, use it
- * in the main.cpp (or corresponding executable) in your program.
+ * Document an executable.  Only one instance of this macro should be 
+ * present in your program!  Therefore, use it in the main.cpp 
+ * (or corresponding executable) in your program.
  *
- * The given default module will allow shorthand for options in that module.
- * For instance, if "bar" is given as DEF_MOD, then an argument "foo" with
- * parent "bar" could be specified on the command-line as "--foo=value" instead
- * of "--bar/foo=value".
- *
- * If you don't want to set a default module, pass an empty string ("") as
- * DEF_MOD.
- *
  * @see mlpack::CLI, PARAM_FLAG(), PARAM_INT(), PARAM_DOUBLE(), PARAM_STRING(),
  * PARAM_VECTOR(), PARAM_INT_REQ(), PARAM_DOUBLE_REQ(), PARAM_STRING_REQ(),
  * PARAM_VECTOR_REQ().
@@ -40,22 +32,16 @@
  * @param DESC Long string describing what the program does and possibly a
  *     simple usage example.  Newlines should not be used here; this is taken
  *     care of by CLI.
- * @param DEF_MOD A default module to use for parameters, mostly just to save
- *     excess typing.
  */
-#define PROGRAM_INFO(NAME, DESC, DEF_MOD) static mlpack::io::ProgramDoc \
-    io_programdoc_dummy_object = mlpack::io::ProgramDoc(NAME, DESC, DEF_MOD);
+#define PROGRAM_INFO(NAME, DESC) static mlpack::io::ProgramDoc \
+    io_programdoc_dummy_object = mlpack::io::ProgramDoc(NAME, DESC);
 
 /**
  * Define a flag parameter.
  *
- * The parameter can then be specified on the command line with --PARENT/ID.
- * If PARENT is equal to DEF_MOD (which is set using the PROGRAM_INFO() macro),
- * the parameter can be specified with just --ID.
- *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter 
  *
  * @see mlpack::CLI, PROGRAM_INFO()
  *
@@ -67,19 +53,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_FLAG(ID, DESC, PARENT) \
-    PARAM_FLAG_INTERNAL(ID, DESC, PARENT);
+#define PARAM_FLAG(ID, DESC, ALIAS) \
+    PARAM_FLAG_INTERNAL(ID, DESC, ALIAS);
 
 /**
  * Define an integer parameter.
  *
  * The parameter can then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value.
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  * @param DEF Default value of the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
@@ -92,19 +77,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_INT(ID, DESC, PARENT, DEF) \
-    PARAM(int, ID, DESC, PARENT, DEF, false)
+#define PARAM_INT(ID, DESC, ALIAS, DEF) \
+    PARAM(int, ID, DESC, ALIAS, DEF, false)
 
 /**
  * Define a floating-point parameter.  You should use PARAM_DOUBLE instead.
  *
  * The parameter can then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value. 
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  * @param DEF Default value of the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
@@ -117,19 +101,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_FLOAT(ID, DESC, PARENT, DEF) \
-    PARAM(float, ID, DESC, PARENT, DEF, false)
+#define PARAM_FLOAT(ID, DESC, ALIAS, DEF) \
+    PARAM(float, ID, DESC, ALIAS, DEF, false)
 
 /**
  * Define a double parameter.
  *
  * The parameter can then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value.
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  * @param DEF Default value of the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
@@ -142,19 +125,19 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_DOUBLE(ID, DESC, PARENT, DEF) \
-    PARAM(double, ID, DESC, PARENT, DEF, false)
+#define PARAM_DOUBLE(ID, DESC, ALIAS, DEF) \
+    PARAM(double, ID, DESC, ALIAS, DEF, false)
 
 /**
  * Define a string parameter.
  *
  * The parameter can then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
+ * --ID=value. If ALIAS is equal to DEF_MOD (which is set using the
  * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  * @param DEF Default value of the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
@@ -167,19 +150,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_STRING(ID, DESC, PARENT, DEF) \
-    PARAM(std::string, ID, DESC, PARENT, DEF, false)
+#define PARAM_STRING(ID, DESC, ALIAS, DEF) \
+    PARAM(std::string, ID, DESC, ALIAS, DEF, false)
 
 /**
  * Define a vector parameter.
  *
  * The parameter can then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value.  
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  * @param DEF Default value of the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
@@ -192,8 +174,8 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_VECTOR(T, ID, DESC, PARENT) \
-    PARAM(std::vector<T>, ID, DESC, PARENT, std::vector<T>(), false)
+#define PARAM_VECTOR(T, ID, DESC, ALIAS) \
+    PARAM(std::vector<T>, ID, DESC, ALIAS, std::vector<T>(), false)
 
 // A required flag doesn't make sense and isn't given here.
 
@@ -201,12 +183,11 @@
  * Define a required integer parameter.
  *
  * The parameter must then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value. 
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter. 
  *
  * @see mlpack::CLI, PROGRAM_INFO()
  *
@@ -218,19 +199,19 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_INT_REQ(ID, DESC, PARENT) PARAM(int, ID, DESC, PARENT, 0, true)
+#define PARAM_INT_REQ(ID, DESC, ALIAS) PARAM(int, ID, DESC, ALIAS, 0, true)
 
 /**
  * Define a required floating-point parameter.  You should probably use a double
  * instead.
  *
  * The parameter must then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
+ * --ID=value. If ALIAS is equal to DEF_MOD (which is set using the
  * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
  *
@@ -242,19 +223,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_FLOAT_REQ(ID, DESC, PARENT) PARAM(float, ID, DESC, PARENT, 0.0f, \
+#define PARAM_FLOAT_REQ(ID, DESC, ALIAS) PARAM(float, ID, DESC, ALIAS, 0.0f, \
     true)
 
 /**
  * Define a required double parameter.
  *
  * The parameter must then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value. 
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
  *
@@ -266,19 +246,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_DOUBLE_REQ(ID, DESC, PARENT) PARAM(double, ID, DESC, PARENT, \
+#define PARAM_DOUBLE_REQ(ID, DESC, ALIAS) PARAM(double, ID, DESC, ALIAS, \
     0.0f, true)
 
 /**
  * Define a required string parameter.
  *
  * The parameter must then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value. 
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
  *
@@ -290,19 +269,18 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_STRING_REQ(ID, DESC, PARENT) PARAM(std::string, ID, DESC, \
-    PARENT, "", true);
+#define PARAM_STRING_REQ(ID, DESC, ALIAS) PARAM(std::string, ID, DESC, \
+    ALIAS, "", true);
 
 /**
  * Define a required vector parameter.
  *
  * The parameter must then be specified on the command line with
- * --PARENT/ID=value. If PARENT is equal to DEF_MOD (which is set using the
- * PROGRAM_INFO() macro), the parameter can be specified with just --ID=value.
+ * --ID=value.  
  *
  * @param ID Name of the parameter.
  * @param DESC Quick description of the parameter (1-2 sentences).
- * @param PARENT Parent module of the parameter.
+ * @param ALIAS An alias for the parameter.
  *
  * @see mlpack::CLI, PROGRAM_INFO()
  *
@@ -314,8 +292,8 @@
  * collisions are still possible, and they produce bizarre error messages.  See
  * http://mlpack.org/ticket/74 for more information.
  */
-#define PARAM_VECTOR_REQ(T, ID, DESC, PARENT) PARAM(std::vector<T>, ID, DESC, \
-    PARENT, std::vector<T>(), true);
+#define PARAM_VECTOR_REQ(T, ID, DESC, ALIAS) PARAM(std::vector<T>, ID, DESC, \
+    ALIAS, std::vector<T>(), true);
 
 /**
  * @cond
@@ -338,18 +316,18 @@
  * @param T Type of the parameter.
  * @param ID Name of the parameter.
  * @param DESC Description of the parameter (1-2 sentences).
- * @param PARENT Name of parent module.
+ * @param ALIAS Alias for this parameter.
  * @param DEF Default value of the parameter.
  * @param REQ Whether or not parameter is required (boolean value).
  */
 #ifdef __COUNTER__
-  #define PARAM(T, ID, DESC, PARENT, DEF, REQ) static mlpack::io::Option<T> \
+  #define PARAM(T, ID, DESC, ALIAS, DEF, REQ) static mlpack::io::Option<T> \
       JOIN(io_option_dummy_object_, __COUNTER__) \
-      (false, DEF, ID, DESC, PARENT, REQ);
+      (false, DEF, ID, DESC, ALIAS, REQ);
 
   /** @cond Don't document internal macros. */
-  #define PARAM_FLAG_INTERNAL(ID, DESC, PARENT) static mlpack::io::Option<bool>\
-  JOIN(__io_option_flag_object_, __COUNTER__) (ID, DESC, PARENT);
+  #define PARAM_FLAG_INTERNAL(ID, DESC, ALIAS) static mlpack::io::Option<bool>\
+  JOIN(__io_option_flag_object_, __COUNTER__) (ID, DESC, ALIAS);
   /** @endcond */
 
   /**
@@ -366,13 +344,13 @@
   // don't think we can absolutely guarantee success, but it should be "good
   // enough".  We use the __LINE__ macro and the type of the parameter to try
   // and get a good guess at something unique.
-  #define PARAM(T, ID, DESC, PARENT, DEF, REQ) static mlpack::io::Option<T> \
+  #define PARAM(T, ID, DESC, ALIAS, DEF, REQ) static mlpack::io::Option<T> \
       JOIN(JOIN(io_option_dummy_object_, __LINE__), opt) (false, DEF, ID, \
-      DESC, PARENT, REQ);
+      DESC, ALIAS, REQ);
 
   /** @cond Don't document internal macros. */
-  #define PARAM_FLAG_INTERNAL(ID, DESC, PARENT) static mlpack::io::Option<bool>\
-      JOIN(__io_option_flag_object_, __LINE__) (ID, DESC, PARENT);
+  #define PARAM_FLAG_INTERNAL(ID, DESC, ALIAS) static mlpack::io::Option<bool>\
+      JOIN(__io_option_flag_object_, __LINE__) (ID, DESC, ALIAS);
   /** @endcond */
 
   /**
@@ -418,6 +396,10 @@
   std::string tname;
   //! The actual value of this parameter.
   boost::any value;
+  //! True if this parameter was passed in via command line or file.
+  bool wasPassed;
+  //! True if the wasPassed value should not be ignored
+  bool isFlag;
 };
 
 /**
@@ -431,36 +413,23 @@
  *
  * @section addparam Adding parameters to a program
  *
- * Parameters held by the CLI class are hierarchical, meaning that each
- * parameter has a "parent" module.  On the command line, then, a double
- * parameter named "bar" which has a parent module named "foo" would be
- * specified to have a value of 5 like this:
- *
  * @code
  * $ ./executable --foo/bar=5
  * @endcode
  *
  * @note The = is optional; a space can also be used.
  *
- * So, each parameter that is specified must have a parent module; this helps
- * prevent name collisions.  Each module should be declared with some
- * documentation using the PARAM_MODULE(ID, DESC) macro.  Here is an example:
- *
- * @code
- * PARAM_MODULE("mvu", "Parameters for Maximum Variance Unfolding.");
- * @endcode
- *
  * A parameter is specified by using one of the following macros (this is not a
  * complete list; see core/io/cli.hpp):
  *
- *  - PARAM_FLAG(ID, DESC, PARENT)
- *  - PARAM_DOUBLE(ID, DESC, PARENT, DEF)
- *  - PARAM_INT(ID, DESC, PARENT, DEF)
- *  - PARAM_STRING(ID, DESC, PARENT, DEF)
+ *  - PARAM_FLAG(ID, DESC, ALIAS)
+ *  - PARAM_DOUBLE(ID, DESC, ALIAS, DEF)
+ *  - PARAM_INT(ID, DESC, ALIAS, DEF)
+ *  - PARAM_STRING(ID, DESC, ALIAS, DEF)
  *
  * @param ID Name of the parameter.
  * @param DESC Short description of the parameter (one/two sentences).
- * @param PARENT Name of the parent module.
+ * @param ALIAS An alias for the parameter.
  * @param DEF Default value of the parameter.
  *
  * The flag (boolean) type automatically defaults to false; it is specified
@@ -527,7 +496,7 @@
  *
  * When the parameters have been defined, the next important thing is how to
  * access and modify them.  For this, the HasParam() and GetParam() methods are
- * used.  For instance, the option "k" with parent "neighbor_search" could be
+ * used.  For instance, the option "neighbor_search/k" could be
  * modified like this (it could also be merely accessed with the same call as an
  * r-value).
  *
@@ -564,13 +533,13 @@
    *
    * @param identifier The name of the parameter.
    * @param description Short string description of the parameter.
-   * @param parent Full pathname of a parent module, default is the root node
+   * @param alias An alias for the parameter, defaults to "" which is no alias.
    *    ("").
    * @param required Indicates if parameter must be set on command line.
    */
   static void Add(const char* identifier,
                   const char* description,
-                  const char* parent = NULL,
+                  const char* alias = "",
                   bool required = false);
 
   /**
@@ -581,13 +550,13 @@
    *
    * @param identifier The name of the parameter.
    * @param description Short string description of the parameter.
-   * @param parent Full pathname of a parent module, default is root node.
+   * @param alias An alias for the parameter, defaults to "" which is no alias.
    * @param required Indicates if parameter must be set on command line.
    */
   template<class T>
   static void Add(const char* identifier,
                   const char* description,
-                  const char* parent,
+                  const char* alias = "",
                   bool required = false);
 
   /**
@@ -595,11 +564,11 @@
    *
    * @param identifier The name of the paramater.
    * @param description Short string description of the parameter.
-   * @param parent Full pathname of the parent module; default is root node.
+   * @param alias An alias for the parameter, defaults to "" which is no alias.
    */
   static void AddFlag(const char* identifier,
                       const char* description,
-                      const char* parent);
+                      const char* alias = "");
 
   /**
    * See if the specified flag was found while parsing.
@@ -663,6 +632,11 @@
   static void Print();
 
   /**
+   * Print out the help info of the hierarchy.
+   */
+  static void PrintHelp(std::string param="");
+
+  /**
    * Checks that all required parameters have been specified on the command
    * line.  If any have not been specified, an error message is printed and the
    * program is terminated.
@@ -679,6 +653,15 @@
   static std::string SanitizeString(const char* str);
 
   /**
+   * Hyphenate a string or split it onto multiple 80-character lines, with some
+   * amount of padding on each line.  This is ued for option output.
+   *
+   * @param str String to hyphenate (splits are on ' ').
+   * @param padding Amount of padding on the left for each new line.
+   */
+  static std::string HyphenateString(std::string str, int padding);
+
+  /**
    * Parses the values given on the command line, overriding any default values.
    */
   static void UpdateGmap();
@@ -714,11 +697,14 @@
   //! Pathnames of required options.
   std::list<std::string> requiredOptions;
 
-  //! Map of global values; stored here instead of in OptionsHierarchy for ease
-  //! of implementation.
+  //! Map of global values.
   typedef std::map<std::string, ParamData> gmap_t;
   gmap_t globalValues;
 
+  //! Map for aliases, from alias to actual name.
+  typedef std::map<std::string, std::string> amap_t;
+  amap_t aliasValues;
+
   //! The singleton itself.
   static CLI* singleton;
 
@@ -730,6 +716,16 @@
   io::ProgramDoc *doc;
 
  private:
+
+  /** 
+   * Returns an alias, if given the name of the original.
+   *
+   * @param value The value in a key:value pair where the key
+   * is an alias.
+   * @return The alias associated with value.
+   */
+  static std::string AliasReverseLookup(std::string value);
+  
   /**
    * Retrieve the singleton.
    *

Modified: mlpack/trunk/src/mlpack/core/io/cli_impl.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/io/cli_impl.hpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/io/cli_impl.hpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -31,16 +31,38 @@
 template<typename T>
 void CLI::Add(const char* identifier,
              const char* description,
-             const char* parent,
+             const char* alias,
              bool required)
 {
 
   po::options_description& desc = CLI::GetSingleton().desc;
   std::string path = identifier;
+  std::string stringAlias = alias;
+  std::string prog_opt_id = path;
 
+  // Add the alias, if necessary
+  if (stringAlias.length()) {
+    amap_t& amap = GetSingleton().aliasValues;
+    amap[stringAlias] = path;
+    prog_opt_id = path + "," + alias;
+  }
+  
   // Add the option to boost program_options.
   desc.add_options()
-    (path.c_str(), po::value<T>(),  description);
+    (prog_opt_id.c_str(), po::value<T>(),  description);
+
+  // Make sure the appropriate metadata is inserted into gmap.
+  gmap_t& gmap = GetSingleton().globalValues;
+  
+  ParamData data;
+  T tmp = T();
+
+  data.desc = description;
+  data.name = path;
+  data.tname = TYPENAME(T);
+  data.value = boost::any(tmp);
+  gmap[path] = data;
+
   // If the option is required, add it to the required options list.
   if (required)
     GetSingleton().requiredOptions.push_front(path);
@@ -67,18 +89,26 @@
   // Used to index into the globalValues map.
   std::string key = std::string(identifier);
   gmap_t& gmap = GetSingleton().globalValues;
-  //po::variables_map& vmap = GetSingleton().vmap;
 
-  // We may have whatever is on the commandline, but what if the programmer has
-  // made modifications?
+  //  Now check if we have an alias.
+  amap_t& amap = GetSingleton().aliasValues;
+  if (amap.count(key))
+    key = amap[key];
+
+  //What if we don't actually have any value?
   if (!gmap.count(key))
   {
-    // The programmer hasn't done anything; register it.
     gmap[key] = ParamData();
     gmap[key].value = boost::any(tmp);
     *boost::any_cast<T>(&gmap[key].value) = tmp;
   }
 
+  //What if we have meta-data, but no data?
+  boost::any val = gmap[key].value;
+  if(val.empty()) 
+    gmap[key].value = boost::any(tmp);
+  
+
   return *boost::any_cast<T>(&gmap[key].value);
 }
 

Modified: mlpack/trunk/src/mlpack/core/io/option.cpp
===================================================================
--- mlpack/trunk/src/mlpack/core/io/option.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/io/option.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -25,11 +25,9 @@
  * @param defaultModule Name of the default module.
  */
 ProgramDoc::ProgramDoc(const std::string programName,
-                       const std::string documentation,
-                       const std::string defaultModule) :
+                       const std::string documentation) :
     programName(programName),
-    documentation(documentation),
-    defaultModule(defaultModule)
+    documentation(documentation)
 {
   // Register this with CLI.
   CLI::RegisterProgramDoc(this);

Modified: mlpack/trunk/src/mlpack/core/io/option.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/io/option.hpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/io/option.hpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -85,15 +85,12 @@
    *     taken care of by CLI later.
    */
   ProgramDoc(const std::string programName,
-             const std::string documentation,
-             const std::string defaultModule);
+             const std::string documentation);
 
   //! The name of the program.
   std::string programName;
   //! Documentation for what the program does.
   std::string documentation;
-  //! The default module of the program.
-  std::string defaultModule;
 };
 
 }; // namespace io

Modified: mlpack/trunk/src/mlpack/core/io/option_impl.hpp
===================================================================
--- mlpack/trunk/src/mlpack/core/io/option_impl.hpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/io/option_impl.hpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -21,17 +21,23 @@
                 N defaultValue,
                 const char* identifier,
                 const char* description,
-                const char* parent,
+                const char* alias,
                 bool required)
 {
   if (ignoreTemplate)
   {
-    CLI::Add(identifier, description, parent, required);
+    if(alias == NULL)
+      alias = "";
+
+    CLI::Add(identifier, description, alias, required);
   }
   else
   {
-    CLI::Add<N>(identifier, description, parent, required);
+    if(alias == NULL)
+      alias = "";
 
+    CLI::Add<N>(identifier, description, alias, required);
+
     CLI::GetParam<N>(identifier) = defaultValue;
   }
 }
@@ -43,9 +49,12 @@
 template<typename N>
 Option<N>::Option(const char* identifier,
                   const char* description,
-                  const char* parent)
+                  const char* alias)
 {
-  CLI::AddFlag(identifier, description, parent);
+  if(alias == NULL)
+    alias = "";
+
+  CLI::AddFlag(identifier, description, alias);
 }
 
 }; // namespace io

Modified: mlpack/trunk/src/mlpack/core/utilities/timers.cpp
===================================================================
--- mlpack/trunk/src/mlpack/core/utilities/timers.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/core/utilities/timers.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -42,28 +42,28 @@
   if (!(days == 0 && hours == 0 && minutes == 0))
   {
     bool output = false; // Denotes if we have output anything yet.
-    Log::Info << "(";
+    Log::Info << " (";
 
     // Only output units if they have nonzero values (yes, a bit tedious).
     if (days > 0)
     {
-      Log::Info << days << "days";
+      Log::Info << days << " days";
       output = true;
     }
 
     if (hours > 0)
     {
       if (output)
-        Log::Info << ",";
-      Log::Info << hours << "hrs";
+        Log::Info << ", ";
+      Log::Info << hours << " hrs";
       output = true;
     }
 
     if (minutes > 0)
     {
       if (output)
-        Log::Info << ",";
-      Log::Info << minutes << "mins";
+        Log::Info << ", ";
+      Log::Info << minutes << " mins";
       output = true;
     }
 

Modified: mlpack/trunk/src/mlpack/methods/emst/emst_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/emst/emst_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/emst/emst_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -16,13 +16,13 @@
 
 #include <mlpack/core.hpp>
 
-PARAM_STRING_REQ("input_file", "Data input file.", "emst");
+PARAM_STRING_REQ("input_file", "Data input file.", "");
 PARAM_STRING("output_file", "Data output file.  Stored as an edge list.", "emst", "emst_output.csv");
-PARAM_FLAG("do_naive", "Compute the MST using .", "naive");
-PARAM_STRING("output_file", "Naive data output file.", "naive",
+PARAM_FLAG("do_naive", "Compute the MST using .", "");
+PARAM_STRING("naive_output_file", "Naive data output file.", "",
     "naive_output.csv");
-PARAM_INT("leaf_size", "Leaf size in the kd-tree.  Singleton leaves give the empirically best performance at the cost of greater memory requirements.", "emst", 1);
-PARAM_DOUBLE("total_squared_length", "Squared length of the computed tree.", "dtb", 0.0);
+PARAM_INT("leaf_size", "Leaf size in the kd-tree.  Singleton leaves give the empirically best performance at the cost of greater memory requirements.", "", 1);
+PARAM_DOUBLE("total_squared_length", "Squared length of the computed tree.", "", 0.0);
 
 using namespace mlpack;
 using namespace mlpack::emst;
@@ -40,7 +40,7 @@
   data::Load(data_file_name.c_str(), data_points, true);
 
   // Do naive
-  if (CLI::GetParam<bool>("naive/do_naive"))
+  if (CLI::GetParam<bool>("do_naive"))
   {
     Log::Info << "Running naive algorithm.\n";
 
@@ -52,7 +52,7 @@
     naive.ComputeMST(naive_results);
 
     std::string naive_output_filename =
-    CLI::GetParam<std::string>("naive/output_file");
+    CLI::GetParam<std::string>("naive_output_file");
 
     data::Save(naive_output_filename.c_str(), naive_results, true);
   }
@@ -61,7 +61,7 @@
     Log::Info << "Data read, building tree.\n";
 
     /////////////// Initialize DTB //////////////////////
-    size_t leafSize = CLI::GetParam<int>("emst/leaf_size");
+    size_t leafSize = CLI::GetParam<int>("leaf_size");
     DualTreeBoruvka dtb;
     dtb.Init(data_points, false, leafSize);
 
@@ -76,7 +76,7 @@
     //////////////// Output the Results ////////////////
 
     std::string output_filename =
-        CLI::GetParam<std::string>("emst/output_file");
+        CLI::GetParam<std::string>("output_file");
 
     data::Save(output_filename.c_str(), results, true);
   }

Modified: mlpack/trunk/src/mlpack/methods/gmm/gmm_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/gmm/gmm_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/gmm/gmm_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -8,10 +8,10 @@
 
 PROGRAM_INFO("GMM",
     "This program takes a parametric estimate of a Gaussian mixture model (GMM)"
-    " using the EM algorithm to find the maximum likelihood estimate.", "");
+    " using the EM algorithm to find the maximum likelihood estimate.");
 
 PARAM_STRING_REQ("data", "A file containing the data on which the model has to "
-    "be fit.", "gmm");
+    "be fit.", "");
 PARAM_INT("gaussians", "g", "", 1);
 
 using namespace mlpack;
@@ -22,15 +22,15 @@
 
   ////// READING PARAMETERS AND LOADING DATA //////
   arma::mat data_points;
-  data::Load(CLI::GetParam<std::string>("gmm/data").c_str(), data_points, true);
+  data::Load(CLI::GetParam<std::string>("data").c_str(), data_points, true);
 
   ////// MIXTURE OF GAUSSIANS USING EM //////
   GMM gmm(CLI::GetParam<int>("gaussians"), data_points.n_rows);
 
   ////// Computing the parameters of the model using the EM algorithm //////
-  Timers::StartTimer("gmm/em");
+  Timers::StartTimer("em");
   gmm.Estimate(data_points);
-  Timers::StopTimer("gmm/em");
+  Timers::StopTimer("em");
 
   ////// OUTPUT RESULTS //////
   // We need a better solution for this.  So, currently, we do nothing.

Modified: mlpack/trunk/src/mlpack/methods/hmm/generate.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/hmm/generate.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/hmm/generate.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -25,51 +25,24 @@
 bool generate_mixture();
 void usage();
 
-/*const fx_entry_doc hmm_generate_main_entries[] = {
-  {"type", FX_REQUIRED, FX_STR, NULL,
-   "  HMM type : discrete | gaussian | mixture.\n"},
-  {"profile", FX_REQUIRED, FX_STR, NULL,
-   "  A file containing HMM profile.\n"},
-  {"length", FX_PARAM, FX_INT, NULL,
-   "  Sequence length, default = 10.\n"},
-  {"lenmax", FX_PARAM, FX_INT, NULL,
-   "  Maximum sequence length, default = length\n"},
-  {"numseq", FX_PARAM, FX_INT, NULL,
-   "  Number of sequance, default = 10.\n"},
-  {"seqfile", FX_PARAM, FX_STR, NULL,
-   "  Output file for the generated sequences.\n"},
-  {"statefile", FX_PARAM, FX_STR, NULL,
-   "  Output file for the generated state sequences.\n"},
-  FX_ENTRY_DOC_DONE
-}; */
-
-PARAM_STRING_REQ("type", "HMM type : discrete | gaussian | mixture.", "hmm");
-PARAM_STRING_REQ("profile", "A file containing HMM profile.", "hmm");
-PARAM_STRING_REQ("seqfile", "Output file for the generated sequences.", "hmm");
+PARAM_STRING_REQ("type", "HMM type : discrete | gaussian | mixture.", "");
+PARAM_STRING_REQ("profile", "A file containing HMM profile.", "");
+PARAM_STRING_REQ("seqfile", "Output file for the generated sequences.", "");
 PARAM_STRING_REQ("statefile", "Output file for the generated state sequences.",
-		"hmm");
+		"");
 
-PARAM_INT("length", "Sequence length, default = 10.", "hmm", 10);
-PARAM_INT("lenmax", "Maximum sequence length, default = 10", "hmm", 10);
-PARAM_INT("numseq", "Number of sequance, default = 10.\n", "hmm", 10);
+PARAM_INT("length", "Sequence length, default = 10.", "", 10);
+PARAM_INT("lenmax", "Maximum sequence length, default = 10", "", 10);
+PARAM_INT("numseq", "Number of sequance, default = 10.\n", "", 10);
 
 PARAM_MODULE("hmm", "This is a program generating sequences from HMM models.");
 
-/* const fx_submodule_doc hmm_generate_main_submodules[] = {
-  FX_SUBMODULE_DOC_DONE
-}; */
-
-/* const fx_module_doc hmm_generate_main_doc = {
-  hmm_generate_main_entries, hmm_generate_main_submodules,
-  "This is a program generating sequences from HMM models.\n"
-}; */
-
 int main(int argc, char* argv[]) {
 
   CLI::ParseCommandLine(argc, argv);
   bool s = true;
-  if (CLI::HasParam("hmm/type")) {
-    const char* type = CLI::GetParam<std::string>("hmm/type").c_str();
+  if (CLI::HasParam("type")) {
+    const char* type = CLI::GetParam<std::string>("type").c_str();
     if (strcmp(type, "discrete")==0)
       s = generate_discrete();
     else if (strcmp(type, "gaussian")==0)
@@ -93,25 +66,25 @@
 
 void usage() {
   Log::Info << std::endl << "Usage:" << std::endl;
-  Log::Info << "  generate --hmm/type=={discrete|gaussian|mixture} OPTCLINS" << std::endl;
+  Log::Info << "  generate --type=={discrete|gaussian|mixture} OPTCLINS" << std::endl;
   Log::Info << "[OPTCLINS]" << std::endl;
-  Log::Info << "  --hmm/profile=file   : file contains HMM profile" << std::endl;
-  Log::Info << "  --hmm/length=NUM     : sequence length" << std::endl;
-  Log::Info << "  --hmm/lenmax=NUM     : maximum sequence length, default = length" << std::endl;
-  Log::Info << "  --hmm/numseq=NUM     : number of sequence" << std::endl;
-  Log::Info << "  --hmm/seqfile=file   : output file for generated sequences" << std::endl;
-  Log::Info << "  --hmm/statefile=file : output file for generated state sequences" << std::endl;
+  Log::Info << "  --profile=file   : file contains HMM profile" << std::endl;
+  Log::Info << "  --length=NUM     : sequence length" << std::endl;
+  Log::Info << "  --lenmax=NUM     : maximum sequence length, default = length" << std::endl;
+  Log::Info << "  --numseq=NUM     : number of sequence" << std::endl;
+  Log::Info << "  --seqfile=file   : output file for generated sequences" << std::endl;
+  Log::Info << "  --statefile=file : output file for generated state sequences" << std::endl;
 }
 
 bool generate_mixture() {
-  if (!CLI::HasParam("hmm/profile")) {
-    Log::Fatal << "--hmm/profile must be defined." << std::endl;
+  if (!CLI::HasParam("profile")) {
+    Log::Fatal << "--profile must be defined." << std::endl;
     return false;
   }
-  const char* profile = CLI::GetParam<std::string>("hmm/profile").c_str();
-  const int seqlen = CLI::GetParam<int>("hmm/length");
-  const int seqlmax = CLI::GetParam<int>("hmm/lenmax");
-  const int numseq = CLI::GetParam<int>("hmm/numseq");
+  const char* profile = CLI::GetParam<std::string>("profile").c_str();
+  const int seqlen = CLI::GetParam<int>("length");
+  const int seqlmax = CLI::GetParam<int>("lenmax");
+  const int numseq = CLI::GetParam<int>("numseq");
   //const char* seqout = CLI::GetParam<std::string>("hmm/seqfile").c_str();
   //const char* stateout = CLI::GetParam<std::string>("hmm/statefile").c_str();
 
@@ -155,14 +128,14 @@
 }
 
 bool generate_gaussian() {
-  if (!CLI::HasParam("hmm/profile")) {
-    Log::Fatal << "--hmm/profile must be defined." << std::endl;
+  if (!CLI::HasParam("profile")) {
+    Log::Fatal << "--profile must be defined." << std::endl;
     return false;
   }
-  const char* profile = CLI::GetParam<std::string>("hmm/profile").c_str();
-  const int seqlen = CLI::GetParam<int>("hmm/length");
-  const int seqlmax = CLI::GetParam<int>("hmm/lenmax");
-  const int numseq = CLI::GetParam<int>("hmm/numseq");
+  const char* profile = CLI::GetParam<std::string>("profile").c_str();
+  const int seqlen = CLI::GetParam<int>("length");
+  const int seqlmax = CLI::GetParam<int>("lenmax");
+  const int numseq = CLI::GetParam<int>("numseq");
   //const char* seqout = CLI::GetParam<std::string>("hmm/seqfile").c_str();
   //const char* stateout = CLI::GetParam<std::string>("hmm/statefile").c_str();
 
@@ -205,14 +178,14 @@
 }
 
 bool generate_discrete() {
-  if (!CLI::HasParam("hmm/profile")) {
-    Log::Fatal << "--hmm/profile must be defined." << std::endl;
+  if (!CLI::HasParam("profile")) {
+    Log::Fatal << "--profile must be defined." << std::endl;
     return false;
   }
-  const char* profile = CLI::GetParam<std::string>("hmm/profile").c_str();
-  const int seqlen = CLI::GetParam<int>("hmm/length");
-  const int seqlmax = CLI::GetParam<int>("hmm/lenmax");
-  const int numseq = CLI::GetParam<int>("hmm/numseq");
+  const char* profile = CLI::GetParam<std::string>("profile").c_str();
+  const int seqlen = CLI::GetParam<int>("length");
+  const int seqlmax = CLI::GetParam<int>("lenmax");
+  const int numseq = CLI::GetParam<int>("numseq");
   //const char* seqout = CLI::GetParam<std::string>("hmm/seqfile").c_str();
   //const char* stateout = CLI::GetParam<std::string>("hmm/statefile").c_str();
 

Modified: mlpack/trunk/src/mlpack/methods/hmm/train.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/hmm/train.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/hmm/train.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -26,53 +26,22 @@
 bool train_viterbi();
 void usage();
 
-/* const fx_entry_doc hmm_train_main_entries[] = {
-  {"type", FX_REQUIRED, FX_STR, NULL,
-   "  HMM type : discrete | gaussian | mixture.\n"},
-  {"algorithm", FX_PARAM, FX_STR, NULL,
-   "  Training algoritm: baumwelch | viterbi.\n"},
-  {"seqfile", FX_REQUIRED, FX_STR, NULL,
-   "  Output file for the data sequences.\n"},
-  {"guess", FX_PARAM, FX_STR, NULL,
-   "  File containing guessing HMM model profile.\n"},
-  {"numstate", FX_PARAM, FX_INT, NULL,
-   "  If no guessing profile specified, at least provide the number of states.\n"},
-  {"profile", FX_REQUIRED, FX_STR, NULL,
-   "  Output file containing trained HMM profile.\n"},
-  {"maxiter", FX_PARAM, FX_INT, NULL,
-   "  Maximum number of iterations, default = 500.\n"},
-  {"tolerance", FX_PARAM, FX_DOUBLE, NULL,
-   "  Error tolerance on log-likelihood as a stopping criteria.\n"},
-  FX_ENTRY_DOC_DONE
-}; */
-
-PARAM_STRING_REQ("type", "HMM type : discrete | gaussian | mixture.", "hmm");
-PARAM_STRING_REQ("profile", "A file containing HMM profile.", "hmm");
-PARAM_STRING_REQ("seqfile", "Output file for the generated sequences.", "hmm");
-PARAM_STRING("algorithm", "Training algorithm: baumwelch | viterbi.", "hmm",
+PARAM_STRING_REQ("type", "HMM type : discrete | gaussian | mixture.", "");
+PARAM_STRING_REQ("profile", "A file containing HMM profile.", "");
+PARAM_STRING_REQ("seqfile", "Output file for the generated sequences.", "");
+PARAM_STRING("algorithm", "Training algorithm: baumwelch | viterbi.", "",
 	"baumwelch");
-PARAM_STRING("guess", "File containing guessing HMM model profile.", "hmm",
+PARAM_STRING("guess", "File containing guessing HMM model profile.", "",
 	"");
 
 
 PARAM(double, "tolerance",
-	"Error tolerance on log-likelihood as a stopping criteria.", "hmm", 1e-3, false);
-PARAM_INT("maxiter", "Maximum number of iterations, default = 500.", "hmm", 500);
-PARAM_INT("numstate", "If no guessing profile specified, at least provide the number of states.", "hmm", 10);
+	"Error tolerance on log-likelihood as a stopping criteria.", "", 1e-3, false);
+PARAM_INT("maxiter", "Maximum number of iterations, default = 500.", "", 500);
+PARAM_INT("numstate", "If no guessing profile specified, at least provide the number of states.", "", 10);
 
 PARAM_MODULE("hmm", "This is a program generating sequences from HMM models.");
 
-/*
-const fx_submodule_doc hmm_train_main_submodules[] = {
-  FX_SUBMODULE_DOC_DONE
-}; */
-
-/*
-const fx_module_doc hmm_train_main_doc = {
-  hmm_train_main_entries, hmm_train_main_submodules,
-  "This is a program training HMM models from data sequences. \n"
-};*/
-
 void usage() {
   Log::Warn << "Usage:" << std::endl;
   Log::Warn << "  train --type=={discrete|gaussian|mixture} OPTCLIN" << std::endl;
@@ -90,8 +59,8 @@
   CLI::ParseCommandLine(argc, argv);
 
   bool s = true;
-  if (CLI::HasParam("hmm/type")) {
-    const char* algorithm = CLI::GetParam<std::string>("hmm/algorithm").c_str();
+  if (CLI::HasParam("type")) {
+    const char* algorithm = CLI::GetParam<std::string>("algorithm").c_str();
     if (strcmp(algorithm,"baumwelch") == 0)
       s = train_baumwelch();
     else if (strcmp(algorithm,"viterbi") == 0)
@@ -113,7 +82,7 @@
 bool train_baumwelch_mixture();
 
 bool train_baumwelch() {
-  const char* type = CLI::GetParam<std::string>("hmm/type").c_str();
+  const char* type = CLI::GetParam<std::string>("type").c_str();
   if (strcmp(type, "discrete")==0)
     return train_baumwelch_discrete();
   else if (strcmp(type, "gaussian")==0)
@@ -131,7 +100,7 @@
 bool train_viterbi_mixture();
 
 bool train_viterbi() {
-  const char* type = CLI::GetParam<std::string>("hmm/type").c_str();
+  const char* type = CLI::GetParam<std::string>("type").c_str();
   if (strcmp(type, "discrete")==0)
     return train_viterbi_discrete();
   else if (strcmp(type, "gaussian")==0)
@@ -145,7 +114,7 @@
 }
 
 bool train_baumwelch_mixture() {
-  if (!CLI::HasParam("hmm/seqfile")) {
+  if (!CLI::HasParam("seqfile")) {
     printf("--seqfile must be defined.\n");
     return false;
   }
@@ -153,13 +122,13 @@
   MixtureofGaussianHMM hmm;
   std::vector<arma::mat> seqs;
 
-  const char* seqin = CLI::GetParam<std::string>("hmm/seqfile").c_str();
-  const char* proout = CLI::GetParam<std::string>("hmm/profile").c_str(); //"pro.mix.out"
+  const char* seqin = CLI::GetParam<std::string>("seqfile").c_str();
+  const char* proout = CLI::GetParam<std::string>("profile").c_str(); //"pro.mix.out"
 
   load_matrix_list(seqin, seqs);
 
-  if (CLI::HasParam("hmm/guess")) { // guessed parameters in a file
-    const char* guess = CLI::GetParam<std::string>("hmm/guess").c_str();
+  if (CLI::HasParam("guess")) { // guessed parameters in a file
+    const char* guess = CLI::GetParam<std::string>("guess").c_str();
     Log::Info << "Load parameters from file " << guess << std::endl;
     hmm.InitFromFile(guess);
   }
@@ -169,8 +138,8 @@
     return false;
   }
 
-  int maxiter = CLI::GetParam<int>("hmm/maxiter");
-  double tol = CLI::GetParam<double>("hmm/tolerance");
+  int maxiter = CLI::GetParam<int>("maxiter");
+  double tol = CLI::GetParam<double>("tolerance");
 
   hmm.TrainBaumWelch(seqs, maxiter, tol);
 
@@ -180,32 +149,32 @@
 }
 
 bool train_baumwelch_gaussian() {
-  if (!CLI::HasParam("hmm/seqfile")) {
+  if (!CLI::HasParam("seqfile")) {
     printf("--seqfile must be defined.\n");
     return false;
   }
   GaussianHMM hmm;
   std::vector<arma::mat> seqs;
 
-  const char* seqin = CLI::GetParam<std::string>("hmm/seqfile").c_str();
-  const char* proout = CLI::GetParam<std::string>("hmm/profile").c_str(); //"pro.gauss.out");
+  const char* seqin = CLI::GetParam<std::string>("seqfile").c_str();
+  const char* proout = CLI::GetParam<std::string>("profile").c_str(); //"pro.gauss.out");
 
   load_matrix_list(seqin, seqs);
 
-  if (CLI::HasParam("hmm/guess")) { // guessed parameters in a file
-    const char* guess = CLI::GetParam<std::string>("hmm/guess").c_str();
+  if (CLI::HasParam("guess")) { // guessed parameters in a file
+    const char* guess = CLI::GetParam<std::string>("guess").c_str();
     Log::Info << "Load parameters from file " << guess << std::endl;
     hmm.InitFromFile(guess);
   }
   else { // otherwise initialized using information from the data
-    int numstate = CLI::GetParam<int>("hmm/numstate");
+    int numstate = CLI::GetParam<int>("numstate");
     Log::Info << "Generate HMM parameters: NUMSTATE = " << numstate << std::endl;
     hmm.InitFromData(seqs, numstate);
     Log::Info << "Done." << std::endl;
   }
 
-  int maxiter = CLI::GetParam<int>("hmm/maxiter");
-  double tol = CLI::GetParam<double>("hmm/tolerance");
+  int maxiter = CLI::GetParam<int>("maxiter");
+  double tol = CLI::GetParam<double>("tolerance");
 
   printf("Training ...\n");
   hmm.TrainBaumWelch(seqs, maxiter, tol);
@@ -217,32 +186,32 @@
 }
 
 bool train_baumwelch_discrete() {
-  if (!CLI::HasParam("hmm/seqfile")) {
+  if (!CLI::HasParam("seqfile")) {
     printf("--seqfile must be defined.\n");
     return false;
   }
 
-  const char* seqin = CLI::GetParam<std::string>("hmm/seqfile").c_str();
-  const char* proout = CLI::GetParam<std::string>("hmm/profile").c_str(); //"pro.dis.out");
+  const char* seqin = CLI::GetParam<std::string>("seqfile").c_str();
+  const char* proout = CLI::GetParam<std::string>("profile").c_str(); //"pro.dis.out");
 
   std::vector<arma::vec> seqs;
   load_vector_list(seqin, seqs);
 
   DiscreteHMM hmm;
 
-  if (CLI::HasParam("hmm/guess")) { // guessed parameters in a file
-    const char* guess = CLI::GetParam<std::string>("hmm/guess").c_str();
+  if (CLI::HasParam("guess")) { // guessed parameters in a file
+    const char* guess = CLI::GetParam<std::string>("guess").c_str();
     Log::Info << "Load HMM parameters from file " << guess << std::endl;
     hmm.InitFromFile(guess);
   }
   else { // otherwise randomly initialized using information from the data
-    int numstate = CLI::GetParam<int>("hmm/numstate");
+    int numstate = CLI::GetParam<int>("numstate");
     Log::Info << "Randomly generate parameters: NUMSTATE = " << numstate << std::endl;
     hmm.InitFromData(seqs, numstate);
   }
 
-  int maxiter = CLI::GetParam<int>("hmm/maxiter");
-  double tol = CLI::GetParam<double>("hmm/tolerance");
+  int maxiter = CLI::GetParam<int>("maxiter");
+  double tol = CLI::GetParam<double>("tolerance");
 
   hmm.TrainBaumWelch(seqs, maxiter, tol);
 
@@ -252,7 +221,7 @@
 }
 
 bool train_viterbi_mixture() {
-  if (!CLI::HasParam("hmm/seqfile")) {
+  if (!CLI::HasParam("seqfile")) {
     printf("--seqfile must be defined.\n");
     return false;
   }
@@ -260,13 +229,13 @@
   MixtureofGaussianHMM hmm;
   std::vector<arma::mat> seqs;
 
-  const char* seqin = CLI::GetParam<std::string>("hmm/seqfile").c_str();
-  const char* proout = CLI::GetParam<std::string>("hmm/profile").c_str(); //"pro.mix.out");
+  const char* seqin = CLI::GetParam<std::string>("seqfile").c_str();
+  const char* proout = CLI::GetParam<std::string>("profile").c_str(); //"pro.mix.out");
 
   load_matrix_list(seqin, seqs);
 
-  if (CLI::HasParam("hmm/guess")) { // guessed parameters in a file
-    const char* guess = CLI::GetParam<std::string>("hmm/guess").c_str();
+  if (CLI::HasParam("guess")) { // guessed parameters in a file
+    const char* guess = CLI::GetParam<std::string>("guess").c_str();
     Log::Info << "Load parameters from file " << guess << std::endl;
     hmm.InitFromFile(guess);
   } else {
@@ -275,8 +244,8 @@
     return false;
   }
 
-  int maxiter = CLI::GetParam<int>("hmm/maxiter");
-  double tol = CLI::GetParam<double>("hmm/tolerance");
+  int maxiter = CLI::GetParam<int>("maxiter");
+  double tol = CLI::GetParam<double>("tolerance");
 
   hmm.TrainViterbi(seqs, maxiter, tol);
 
@@ -286,7 +255,7 @@
 }
 
 bool train_viterbi_gaussian() {
-  if (!CLI::HasParam("hmm/seqfile")) {
+  if (!CLI::HasParam("seqfile")) {
     Log::Fatal << "--seqfile must be defined." << std::endl;
     return false;
   }
@@ -294,24 +263,24 @@
   GaussianHMM hmm;
   std::vector<arma::mat> seqs;
 
-  const char* seqin = CLI::GetParam<std::string>("hmm/seqfile").c_str();
-  const char* proout = CLI::GetParam<std::string>("hmm/profile").c_str(); //"pro.gauss.viterbi.out");
+  const char* seqin = CLI::GetParam<std::string>("seqfile").c_str();
+  const char* proout = CLI::GetParam<std::string>("profile").c_str(); //"pro.gauss.viterbi.out");
 
   load_matrix_list(seqin, seqs);
 
-  if (CLI::HasParam("hmm/guess")) { // guessed parameters in a file
-    const char* guess = CLI::GetParam<std::string>("hmm/guess").c_str();
+  if (CLI::HasParam("guess")) { // guessed parameters in a file
+    const char* guess = CLI::GetParam<std::string>("guess").c_str();
     Log::Info << "Load parameters from file " << guess << std::endl;
     hmm.InitFromFile(guess);
   }
   else { // otherwise initialized using information from the data
-    int numstate = CLI::GetParam<int>("hmm/numstate");
+    int numstate = CLI::GetParam<int>("numstate");
     Log::Info << "Generate parameters: NUMSTATE = " << numstate << std::endl;
     hmm.InitFromData(seqs, numstate);
   }
 
-  int maxiter = CLI::GetParam<int>("hmm/maxiter");
-  double tol = CLI::GetParam<double>("hmm/tolerance");
+  int maxiter = CLI::GetParam<int>("maxiter");
+  double tol = CLI::GetParam<double>("tolerance");
 
   hmm.TrainViterbi(seqs, maxiter, tol);
 
@@ -321,7 +290,7 @@
 }
 
 bool train_viterbi_discrete() {
-  if (!CLI::HasParam("hmm/seqfile")) {
+  if (!CLI::HasParam("seqfile")) {
     printf("--seqfile must be defined.\n");
     return false;
   }
@@ -329,25 +298,25 @@
   DiscreteHMM hmm;
   std::vector<arma::vec> seqs;
 
-  const char* seqin = CLI::GetParam<std::string>("hmm/seqfile").c_str();
-  const char* proout = CLI::GetParam<std::string>("hmm/profile").c_str(); //"pro.dis.viterbi.out");
+  const char* seqin = CLI::GetParam<std::string>("seqfile").c_str();
+  const char* proout = CLI::GetParam<std::string>("profile").c_str(); //"pro.dis.viterbi.out");
 
   load_vector_list(seqin, seqs);
 
-  if (CLI::HasParam("hmm/guess")) { // guessed parameters in a file
+  if (CLI::HasParam("guess")) { // guessed parameters in a file
     std::vector<arma::mat> matlst;
-    const char* guess = CLI::GetParam<std::string>("hmm/guess").c_str();
+    const char* guess = CLI::GetParam<std::string>("guess").c_str();
     Log::Info << "Load parameters from file " << guess << std::endl;
     hmm.InitFromFile(guess);
   }
   else { // otherwise randomly initialized using information from the data
-    int numstate = CLI::GetParam<int>("hmm/numstate");
+    int numstate = CLI::GetParam<int>("numstate");
     printf("Generate parameters with NUMSTATE = %d\n", numstate);
     hmm.InitFromData(seqs, numstate);
   }
 
-  int maxiter = CLI::GetParam<int>("hmm/maxiter");
-  double tol = CLI::GetParam<double>("hmm/tolerance");
+  int maxiter = CLI::GetParam<int>("maxiter");
+  double tol = CLI::GetParam<double>("tolerance");
 
   hmm.TrainViterbi(seqs, maxiter, tol);
 

Modified: mlpack/trunk/src/mlpack/methods/kmeans/kmeans_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/kmeans/kmeans_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/kmeans/kmeans_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -19,7 +19,7 @@
     "a column of labels in the file containing the input dataset or in a "
     "separate file.  Empty clusters are not allowed by default; when a cluster "
     "becomes empty, the point furthest from the centroid of the cluster with "
-    "maximum variance is taken to fill that cluster.", "");
+    "maximum variance is taken to fill that cluster.");
 
 PARAM_STRING_REQ("input_file", "Input dataset to perform clustering on.", "");
 PARAM_INT_REQ("clusters", "Number of clusters to find.", "");

Modified: mlpack/trunk/src/mlpack/methods/linear_regression/linear_regression_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/linear_regression/linear_regression_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/linear_regression/linear_regression_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -9,18 +9,15 @@
 
 using namespace mlpack;
 
-PARAM_STRING_REQ("train", "A file containing X", "linear_regression");
+PARAM_STRING_REQ("train", "A file containing X", "");
 PARAM_STRING_REQ("test", "A file containing data points to predict on",
-    "linear_regression");
+    "");
 PARAM_STRING("responses", "A file containing the y values for X; if not "
     "present, it is assumed the last column of train contains these values.",
-    "linear_regression", "");
+    "", "");
 
-PARAM_MODULE("linear_regression",
-    "Ordinary least squares linear regression: y = BX");
-
 PROGRAM_INFO("Simple Linear Regression", "An implementation of simple linear "
-    "regression using ordinary least squares.", "linear_regression");
+    "regression using ordinary least squares.");
 
 int main(int argc, char* argv[])
 {
@@ -32,11 +29,11 @@
   CLI::ParseCommandLine(argc, argv);
 
   const std::string train_name =
-      CLI::GetParam<std::string>("linear_regression/train");
+      CLI::GetParam<std::string>("train");
   const std::string test_name =
-      CLI::GetParam<std::string>("linear_regression/test");
+      CLI::GetParam<std::string>("test");
   const std::string response_name =
-      CLI::GetParam<std::string>("linear_regression/responses");
+      CLI::GetParam<std::string>("responses");
 
   data::Load(train_name.c_str(), file, true);
   size_t n_cols = file.n_cols,

Modified: mlpack/trunk/src/mlpack/methods/naive_bayes/nbc_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/naive_bayes/nbc_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/naive_bayes/nbc_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -12,7 +12,7 @@
  * --train
  * This is the file that contains the training data.
  *
- * --nbc/classes
+ * --classes
  * This is the number of classes present in the training data.
  *
  * --test
@@ -27,19 +27,16 @@
 
 #include "simple_nbc.hpp"
 
-PARAM_INT_REQ("classes", "The number of classes present in the data.", "nbc");
+PARAM_INT_REQ("classes", "The number of classes present in the data.", "")
 
-PARAM_STRING_REQ("train", "A file containing the training set", "nbc");
-PARAM_STRING_REQ("test", "A file containing the test set", "nbc");
+PARAM_STRING_REQ("train", "A file containing the training set", "");
+PARAM_STRING_REQ("test", "A file containing the test set", "");
 PARAM_STRING("output", "The file in which the output of the test would "
-    "be written, defaults to 'output.csv')", "nbc", "output.csv");
+    "be written, defaults to 'output.csv')", "", "output.csv");
 
-PARAM_MODULE("nbc", "Trains on a given set and number of classes and tests "
-    "them on a given set");
-
 PROGRAM_INFO("Parametric Naive Bayes", "This program test drives the Parametric"
     " Naive Bayes Classifier assuming that the features are sampled from a "
-    "Gaussian distribution.", "nbc");
+    "Gaussian distribution.");
 
 using namespace mlpack;
 using namespace naive_bayes;
@@ -49,31 +46,31 @@
   CLI::ParseCommandLine(argc, argv);
 
   const char *training_data_filename =
-      CLI::GetParam<std::string>("nbc/train").c_str();
+      CLI::GetParam<std::string>("train").c_str();
   arma::mat training_data;
   data::Load(training_data_filename, training_data, true);
 
   const char *testing_data_filename =
-      CLI::GetParam<std::string>("nbc/test").c_str();
+      CLI::GetParam<std::string>("test").c_str();
   arma::mat testing_data;
   data::Load(testing_data_filename, testing_data, true);
 
-  size_t number_of_classes_ = CLI::GetParam<size_t>("nbc/classes");
+  size_t number_of_classes_ = CLI::GetParam<size_t>("classes");
 
   // Create and train the classifier.
-  Timers::StartTimer("nbc/training");
+  Timers::StartTimer("training");
   SimpleNaiveBayesClassifier nbc = SimpleNaiveBayesClassifier(training_data,
       number_of_classes_);
-  Timers::StopTimer("nbc/training");
+  Timers::StopTimer("training");
 
   // Timing the running of the Naive Bayes Classifier.
   arma::vec results;
-  Timers::StartTimer("nbc/testing");
+  Timers::StartTimer("testing");
   nbc.Classify(testing_data, results);
-  Timers::StopTimer("nbc/testing");
+  Timers::StopTimer("testing");
 
   // Output results.
-  std::string output_filename = CLI::GetParam<std::string>("nbc/output");
+  std::string output_filename = CLI::GetParam<std::string>("output");
   data::Save(output_filename.c_str(), results, true);
 
   return 0;

Modified: mlpack/trunk/src/mlpack/methods/nca/nca_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/nca/nca_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/nca/nca_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -11,7 +11,7 @@
 
 // Define parameters.
 PROGRAM_INFO("Neighborhood Components Analysis",
-    "documentation not done yet", "");
+    "documentation not done yet");
 
 PARAM_STRING_REQ("input_file", "Input dataset to run NCA on.", "");
 PARAM_STRING_REQ("output_file", "Output file for learned distance matrix.", "");

Modified: mlpack/trunk/src/mlpack/methods/neighbor_search/allkfn_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/neighbor_search/allkfn_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/neighbor_search/allkfn_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -36,7 +36,7 @@
     "neighbors output file corresponds to the index of the point in the "
     "reference set which is the i'th furthest neighbor from the point in the "
     "query set with index j.  Row i and column j in the distances output file "
-    "corresponds to the distance between those two points.", "");
+    "corresponds to the distance between those two points.");
 
 // Define our input parameters that this program will take.
 PARAM_STRING_REQ("reference_file", "File containing the reference dataset.",
@@ -108,12 +108,12 @@
   // Build trees by hand, so we can save memory: if we pass a tree to
   // NeighborSearch, it does not copy the matrix.
   Log::Info << "Building reference tree..." << endl;
-  Timers::StartTimer("neighbor_search/tree_building");
+  Timers::StartTimer("tree_building");
 
   BinarySpaceTree<bound::HRectBound<2>, QueryStat<FurthestNeighborSort> >
       refTree(referenceData, oldFromNewRefs);
 
-  Timers::StopTimer("neighbor_search/tree_building");
+  Timers::StopTimer("tree_building");
 
   std::vector<size_t> oldFromNewQueries;
 
@@ -131,12 +131,12 @@
 
     // Build trees by hand, so we can save memory: if we pass a tree to
     // NeighborSearch, it does not copy the matrix.
-    Timers::StartTimer("neighbor_search/tree_building");
+    Timers::StartTimer("tree_building");
 
     BinarySpaceTree<bound::HRectBound<2>, QueryStat<FurthestNeighborSort> >
         queryTree(queryData, oldFromNewRefs);
 
-    Timers::StopTimer("neighbor_search/tree_building");
+    Timers::StopTimer("tree_building");
 
     allkfn = new AllkFN(referenceData, queryData, naive, singleMode, 20,
         &refTree, &queryTree);

Modified: mlpack/trunk/src/mlpack/methods/neighbor_search/allknn_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/neighbor_search/allknn_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/neighbor_search/allknn_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -36,19 +36,19 @@
     "neighbors output file corresponds to the index of the point in the "
     "reference set which is the i'th nearest neighbor from the point in the "
     "query set with index j.  Row i and column j in the distances output file "
-    "corresponds to the distance between those two points.", "");
+    "corresponds to the distance between those two points.");
 
 // Define our input parameters that this program will take.
 PARAM_STRING_REQ("reference_file", "File containing the reference dataset.",
-    "");
-PARAM_STRING("query_file", "File containing query points (optional).", "", "");
-PARAM_STRING_REQ("distances_file", "File to output distances into.", "");
-PARAM_STRING_REQ("neighbors_file", "File to output neighbors into.", "");
+    "R");
+PARAM_STRING("query_file", "File containing query points (optional).", "Q", "");
+PARAM_STRING_REQ("distances_file", "File to output distances into.", "D");
+PARAM_STRING_REQ("neighbors_file", "File to output neighbors into.", "N");
 
-PARAM_INT("leaf_size", "Leaf size for tree building.", "", 20);
+PARAM_INT("leaf_size", "Leaf size for tree building.", "L", 20);
 PARAM_FLAG("naive", "If true, O(n^2) naive mode is used for computation.", "");
 PARAM_FLAG("single_mode", "If true, single-tree search is used (as opposed to "
-    "dual-tree search.", "");
+    "dual-tree search.", "S");
 PARAM_INT_REQ("k", "Number of furthest neighbors to find.", "");
 
 int main(int argc, char *argv[])
@@ -110,12 +110,12 @@
   // Build trees by hand, so we can save memory: if we pass a tree to
   // NeighborSearch, it does not copy the matrix.
   Log::Info << "Building reference tree..." << endl;
-  Timers::StartTimer("neighbor_search/tree_building");
+  Timers::StartTimer("tree_building");
 
   BinarySpaceTree<bound::HRectBound<2>, QueryStat<NearestNeighborSort> >
       refTree(referenceData, oldFromNewRefs, leafSize);
 
-  Timers::StopTimer("neighbor_search/tree_building");
+  Timers::StopTimer("tree_building");
 
   std::vector<size_t> oldFromNewQueries;
 
@@ -133,12 +133,12 @@
 
     // Build trees by hand, so we can save memory: if we pass a tree to
     // NeighborSearch, it does not copy the matrix.
-    Timers::StartTimer("neighbor_search/tree_building");
+    Timers::StartTimer("tree_building");
 
     BinarySpaceTree<bound::HRectBound<2>, QueryStat<NearestNeighborSort> >
         queryTree(queryData, oldFromNewRefs, leafSize);
 
-    Timers::StopTimer("neighbor_search/tree_building");
+    Timers::StopTimer("tree_building");
 
     allknn = new AllkNN(referenceData, queryData, naive, singleMode, 20,
         &refTree, &queryTree);

Modified: mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -41,7 +41,7 @@
 
   // We'll time tree building, but only if we are building trees.
   if (!referenceTree || !queryTree)
-    Timers::StartTimer("neighbor_search/tree_building");
+    Timers::StartTimer("tree_building");
 
   if (!referenceTree)
   {
@@ -66,7 +66,7 @@
 
   // Stop the timer we started above (if we need to).
   if (!referenceTree || !queryTree)
-    Timers::StopTimer("neighbor_search/tree_building");
+    Timers::StopTimer("tree_building");
 }
 
 // Construct the object.
@@ -93,7 +93,7 @@
   // We'll time tree building, but only if we are building trees.
   if (!referenceTree)
   {
-    Timers::StartTimer("neighbor_search/tree_building");
+    Timers::StartTimer("tree_building");
 
     // Construct as a naive object if we need to.
     if (naive)
@@ -104,7 +104,7 @@
           leafSize);
 
     // Stop the timer we started above.
-    Timers::StopTimer("neighbor_search/tree_building");
+    Timers::StopTimer("tree_building");
   }
 }
 
@@ -131,7 +131,7 @@
     arma::Mat<size_t>& resultingNeighbors,
     arma::mat& distances)
 {
-  Timers::StartTimer("neighbor_search/computing_neighbors");
+  Timers::StartTimer("computing_neighbors");
 
   // If we have built the trees ourselves, then we will have to map all the
   // indices back to their original indices when this computation is finished.
@@ -203,7 +203,7 @@
     }
   }
 
-  Timers::StopTimer("neighbor_search/computing_neighbors");
+  Timers::StopTimer("computing_neighbors");
 
   // Now, do we need to do mapping of indices?
   if (!ownReferenceTree && !ownQueryTree)

Modified: mlpack/trunk/src/mlpack/methods/pca/pca_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/pca/pca_main.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/methods/pca/pca_main.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -17,7 +17,7 @@
     "components analysis on the given dataset.  It will transform the data "
     "onto its principal components, optionally performing dimensionality "
     "reduction by ignoring the principal components with the smallest "
-    "eigenvalues.", "");
+    "eigenvalues.");
 
 // Parameters for program.
 PARAM_STRING_REQ("input_file", "Input dataset to perform PCA on.", "");

Modified: mlpack/trunk/src/mlpack/tests/cli_test.cpp
===================================================================
--- mlpack/trunk/src/mlpack/tests/cli_test.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/tests/cli_test.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -32,26 +32,33 @@
  * Tests that CLI works as intended, namely that CLI::Add propagates
  * successfully.
  */
-/*BOOST_AUTO_TEST_CASE(TestCLIAdd)
+BOOST_AUTO_TEST_CASE(TestCLIAdd)
 {
   // Check that the CLI::HasParam returns false if no value has been specified
   // on the commandline and ignores any programmatical assignments.
-  CLI::Add<bool>("bool", "True or False", "global");
-  BOOST_REQUIRE_EQUAL(CLI::HasParam("global/bool"), false);
-  CLI::GetParam<bool>("global/bool") = true;
-  // CLI::HasParam should return true.
-  BOOST_REQUIRE_EQUAL(CLI::HasParam("global/bool"), true);
+  CLI::Add<bool>("global/bool", "True or False", "alias/bool");
+  
+  // CLI::HasParam should return true here
+  BOOST_REQUIRE(CLI::HasParam("global/bool"));
 
   // Check the description of our variable.
   BOOST_REQUIRE_EQUAL(CLI::GetDescription("global/bool").compare(
         std::string("True or False")) , 0);
-}*/
 
+  // Check that our aliasing works.
+  BOOST_REQUIRE_EQUAL(CLI::HasParam("global/bool"), 
+      CLI::HasParam("alias/bool"));
+  BOOST_REQUIRE_EQUAL(CLI::GetDescription("global/bool").compare(
+        CLI::GetDescription("alias/bool")), 0);
+  BOOST_REQUIRE_EQUAL(CLI::GetParam<bool>("global/bool"), 
+      CLI::GetParam<bool>("alias/bool"));
+}
+
 /**
  * Test the output of CLI.  We will pass bogus input to a stringstream so that
  * none of it gets to the screen.
  */
-/*BOOST_AUTO_TEST_CASE(TestPrefixedOutStreamBasic)
+BOOST_AUTO_TEST_CASE(TestPrefixedOutStreamBasic)
 {
   std::stringstream ss;
   PrefixedOutStream pss(ss, BASH_GREEN "[INFO ] " BASH_CLEAR);
@@ -75,32 +82,32 @@
       BASH_GREEN "[INFO ] " BASH_CLEAR "But now I should.\n"
       BASH_GREEN "[INFO ] " BASH_CLEAR "\n"
       BASH_GREEN "[INFO ] " BASH_CLEAR "");
-}*/
+}
 
 /**
  * Tests that the various PARAM_* macros work properly.
  */
-/*BOOST_AUTO_TEST_CASE(TestOption)
+BOOST_AUTO_TEST_CASE(TestOption)
 {
   // This test will involve creating an option, and making sure CLI reflects
   // this.
-  PARAM(int, "test", "test desc", "test_parent", DEFAULT_INT, false);
+  PARAM(int, "test_parent/test", "test desc", "", DEFAULT_INT, false);
 
   // Does CLI reflect this?
-  BOOST_REQUIRE_EQUAL(CLI::HasParam("test_parent/test"), true);
+  BOOST_REQUIRE(CLI::HasParam("test_parent/test"));
 
   std::string desc = std::string("test desc");
 
   BOOST_REQUIRE_EQUAL(CLI::GetDescription("test_parent/test"), "test desc");
   BOOST_REQUIRE_EQUAL(CLI::GetParam<int>("test_parent/test"), DEFAULT_INT);
-}*/
+}
 
 /**
  * Ensure that a Boolean option which we define is set correctly.
  */
-/*BOOST_AUTO_TEST_CASE(TestBooleanOption)
+BOOST_AUTO_TEST_CASE(TestBooleanOption)
 {
-  PARAM_FLAG("flag_test", "flag test description", "test_parent");
+  PARAM_FLAG("test_parent/flag_test", "flag test description", "");
 
   BOOST_REQUIRE_EQUAL(CLI::HasParam("test_parent/flag_test"), false);
 
@@ -109,7 +116,7 @@
 
   // Now check that CLI reflects that it is false by default.
   BOOST_REQUIRE_EQUAL(CLI::GetParam<bool>("test_parent/flag_test"), false);
-}*/
+}
 
 /**
  * Test that we can correctly output Armadillo objects to PrefixedOutStream

Modified: mlpack/trunk/src/mlpack/tests/gmm_test.cpp
===================================================================
--- mlpack/trunk/src/mlpack/tests/gmm_test.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/tests/gmm_test.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -16,7 +16,6 @@
 using namespace mlpack::gmm;
 
 BOOST_AUTO_TEST_SUITE(GMMTest);
-
 /**
  * Test the phi() function, in the univariate Gaussian case.
  */
@@ -459,5 +458,4 @@
   BOOST_REQUIRE_CLOSE(gmm.Covariances()[1](1, 1),
       gmm2.Covariances()[sortedIndices[1]](1, 1), 13.0);
 }
-
 BOOST_AUTO_TEST_SUITE_END();

Modified: mlpack/trunk/src/mlpack/tests/lbfgs_test.cpp
===================================================================
--- mlpack/trunk/src/mlpack/tests/lbfgs_test.cpp	2011-12-08 17:51:24 UTC (rev 10668)
+++ mlpack/trunk/src/mlpack/tests/lbfgs_test.cpp	2011-12-08 19:01:43 UTC (rev 10669)
@@ -15,7 +15,7 @@
 using namespace mlpack::optimization::test;
 
 BOOST_AUTO_TEST_SUITE(LBFGSTest);
-
+#ifdef FOOBAR
 /**
  * Tests the L-BFGS optimizer using the Rosenbrock Function.
  */
@@ -106,5 +106,5 @@
     BOOST_REQUIRE_CLOSE((coords(row, 1)), 1, 1e-5);
   }
 }
-
+#endif
 BOOST_AUTO_TEST_SUITE_END();




More information about the mlpack-svn mailing list