Commit c29431c8 authored by André Anjos's avatar André Anjos 💬

Clean-up; C++ class documentation

parent af301a29
include LICENSE README.rst bootstrap.py buildout.cfg
recursive-include doc conf.py *.rst
recursive-include doc conf.py doxygen.rc *.rst
recursive-include xbob/learn/libsvm *.cpp *.h
recursive-include xbob/learn/svm/data *.*
recursive-include xbob/learn/libsvm/data *.*
......@@ -5,7 +5,6 @@
[buildout]
parts = scripts
eggs = xbob.learn.libsvm
ipdb
extensions = xbob.buildout
mr.developer
auto-checkout = *
......
......@@ -179,4 +179,343 @@ Other Utilities
You must check for :c:func:`PyErr_Occurred` after a call to this function to
make sure that the conversion was correctly performed.
Pure C/C++ API
--------------
As explained above, each ``PyObject`` produced by this library contains a
pointer to a pure C++ implementation of a similar object. The C++ of such
objects is described in this section.
.. cpp:type:: bob::learn::libsvm::machine_t
Enumeration defining the types of SVM's available within this
implementation. The following are legal values:
* ``C_SVC``
* ``NU_SVC``
* ``ONE_CLASS`` - currently, **unsupported**
* ``EPSILON_SVR`` - currently, **unsupported**
* ``NU_SVR`` - currently, **unsupported**
.. cpp:type:: bob::learn::libsvm::kernel_t
Enumeration defining the types of kernels available within this
implementation. The following are legal values:
* ``LINEAR``
* ``POLY``
* ``RBF``
* ``SIGMOID``
* ``PRECOMPUTED`` - currently, **unsupported**
.. cpp:class:: bob::learn::libsvm::File
Loads a given libsvm data file. The data file format, as defined on the
library README is like this:
[label] [index1]:[value1] [index2]:[value2] ...
[label] [index1]:[value1] [index2]:[value2] ...
[label] [index1]:[value1] [index2]:[value2] ...
The labels are integer values, so are the indexes, starting from "1" (and
not from zero as a C-programmer would expect. The values are floating point.
Zero values are suppressed - this is a sparse format.
.. cpp:function:: File (const std::string & filename)
Constructor, initializes the file readout.
.. cpp:function:: virtual ~File ()
Virtualized destructor
.. cpp:function:: size_t shape()
Returns the size of each entry in the file, in number of
floats
.. cpp:function:: size_t samples()
Returns the number of samples in the file.
.. cpp:function:: void reset()
Resets the file, going back to the beginning.
.. cpp:function:: bool read(int & label, blitz::Array<double, 1> & values)
Reads the next entry. Values are organized according to the
indexed labels at the file. Returns 'false' if the file is
over or something goes wrong.
.. cpp:function:: bool read_(int & label, blitz::Array<double, 1> & values)
Reads the next entry on the file, but without checking.
Returns 'false' if the file is over or something goes wrong
reading the file.
.. cpp:function:: const std::string& filename()
Returns the name of the file being read.
.. cpp:function:: bool good()
Tests if the file is still good to go.
.. cpp:function:: bool eof()
.. cpp:function:: bool fail()
.. cpp:class:: bob::learn::libsvm::Machine
Interface to ``svm_model``, from LIBSVM. Incorporates prediction.
.. cpp:function:: Machine(const std::string& model_file)
Builds a new Support Vector Machine from a LIBSVM model file.
When you load using the libsvm model loader, note that the scaling
parameters will be set to defaults (subtraction of 0.0 and division by
1.0). If you need scaling to be applied, set it individually using the
appropriate methods bellow.
.. cpp:function:: Machine(bob::io::HDF5File& config)
Builds a new Support Vector *Machine* from an HDF5 file
containing the configuration for this machine. Scaling
parameters are also loaded from the file. Using this
constructor assures a 100% state recovery from previous
sessions.
.. cpp:function:: Machine(boost::shared_ptr<svm_model> model)
Builds a new SVM model from a trained model. Scaling parameters will be
neutral (subtraction := 0.0, division := 1.0).
.. note::
This method is typically only used by the respective
:cpp:class`bob::learn::libsvm::Trainer` as it requires the creation of
the object ``svm_model``. You can still make use of it if you decide
to implement the model instantiation yourself.
.. cpp:function:: virtual ~Machine()
Virtual d'tor
.. cpp:function:: size_t inputSize()
Tells the input size this machine expects
.. cpp:function:: size_t outputSize()
The number of outputs depends on the number of classes the machine has to
deal with. If the problem is a regression problem, the number of outputs
is fixed to 1. The same happens in a binary classification problem.
Otherwise, the output size is the same as the number of classes being
discriminated.
.. cpp:function:: size_t numberOfClasses()
Tells the number of classes the problem has.
.. cpp:function:: int classLabel(size_t i)
Returns the class label (as stored inside the svm_model object) for a
given class 'i'.
.. cpp:function:: bob::learn::libsvm::machine_t machineType()
The SVM type
.. cpp:function:: bob::learn::libsvm::kernel_t kernelType()
Kernel type
.. cpp:function:: int polynomialDegree()
Polinomial degree, if kernel is ``POLY``
.. cpp:function:: double gamma()
:math:`\gamma` factor, for ``POLY``, ``RBF`` or ``SIGMOID`` kernels
.. cpp:function:: double coefficient0()
Coefficient 0 for ``POLY`` and ``SIGMOID`` kernels
.. cpp:function:: bool supportsProbability()
Tells if this model supports probability output.
.. cpp:function:: const blitz::Array<double, 1>& getInputSubtraction()
Returns the input subtraction factor
.. cpp:function:: void setInputSubtraction(const blitz::Array<double, 1>& v)
Sets the current input subtraction factor. We will check that the number
of inputs (first dimension of weights) matches the number of values
currently set and will raise an exception if that is not the case.
.. cpp:function:: void setInputSubtraction(double v)
Sets all input subtraction values to a specific value.
.. cpp:function:: const blitz::Array<double, 1> & getInputDivision()
Returns the input division factor
.. cpp:function:: void setInputDivision(const blitz::Array<double, 1> & v)
Sets the current input division factor. We will check that the number of
inputs (first dimension of weights) matches the number of values
currently set and will raise an exception if that is not the case.
.. cpp:function:: void setInputDivision(double v)
Sets all input division values to a specific value.
.. cpp:function:: int predictClass(const blitz::Array<double, 1>& input)
Predict, output classes only. Note that the number of labels in the
output "labels" array should be the same as the number of input.
.. cpp:function:: int predictClass_(const blitz::Array<double, 1> & input)
Predict, output classes only. Note that the number of labels in the
output "labels" array should be the same as the number of input.
This does the same as :cpp:func:`predictClass`, but does not check the
input.
.. cpp:function:: int predictClassAndScores(const blitz::Array<double, 1>& input, blitz::Array<double, 1>& scores)
Predicts class and scores output for each class on this SVM,
.. note::
The output array must be lying on contiguous memory. This is also
checked.
.. cpp:function:: int predictClassAndScores_(const blitz::Array<double, 1>& input, blitz::Array<double, 1>& scores)
Predicts output class and scores. Same as above, but does not check
.. cpp:function:: int predictClassAndProbabilities(const blitz::Array<double, 1>& input, blitz::Array<double, 1>& probabilities)
Predict, output class and probabilities for each class on this SVM, but
only if the model supports it. Otherwise, throws a run-time exception.
.. note::
The output array must be lying on contiguous memory. This is also
checked.
.. cpp:function:: int predictClassAndProbabilities_(const blitz::Array<double, 1>& input, blitz::Array<double, 1>& probabilities)
Predicts, output class and probability, but only if the model supports it.
Same as above, but does not check
.. cpp:function:: void save(const std::string& filename)
Saves the current model state to a file. With this variant, the model is
saved on simpler libsvm model file that does not include the scaling
parameters set on this machine.
.. cpp:function:: void save(bob::io::HDF5File& config)
Saves the whole machine into a configuration file. This
allows for a single instruction parameter loading, which
includes both the model and the scaling parameters.
.. cpp:class:: bob::learn::libsvm::Trainer
This class emulates the behavior of the command line utility called
``svm-train``, from LIBSVM. These bindings do not support:
* Precomputed Kernels
* Regression Problems
* Different weights for every label (-wi option in svm-train)
Fell free to implement those and remove these remarks.
.. todo:: Support for weight cost in multi-class classification?
.. cpp:function:: Trainer(bob::learn::libsvm::machine_t machine_type = C_SVC, bob::learn::libsvm::kernel_t kernel_type = RBF, double cache_size = 100, double eps = 1.e-3, bool shrinking = true, bool probability = false)
Builds a new trainer setting the default parameters as defined in the
command line application ``svm-train``.
.. cpp:function:: ~Trainer()
Destructor virtualisation
.. cpp:function:: bob::learn::libsvm::Machine* train(const std::vector<blitz::Array<double, 2>>& data)
Trains a new machine for multi-class classification. If the number of
classes in data is 2, then the assigned labels will be -1 and +1. If the
number of classes is greater than 2, labels are picked starting from 1
(i.e., 1, 2, 3, 4, etc.). If what you want is regression, the size of
the input data array should be 1.
Returns a new object you must deallocate yourself.
.. cpp:function:: bob::learn::libsvm::Machine* train(const std::vector<blitz::Array< double, 2>>& data, const blitz::Array<double, 1>& input_subtract, const blitz::Array<double, 1>& input_division)
This version accepts scaling parameters that will be applied column-wise
to the input data.
Returns a new object you must deallocate yourself.
.. cpp:function:: machine_t getMachineType()
.. cpp:function:: void setMachineType(machine_t v)
.. cpp:function:: kernel_t getKernelType()
.. cpp:function:: void setKernelType(kernel_t v)
.. cpp:function:: int getDegree()
.. cpp:function:: void setDegree(int v)
.. cpp:function:: double getGamma()
.. cpp:function:: void setGamma(double v)
.. cpp:function:: double getCoef0()
.. cpp:function:: void setCoef0(double v)
.. cpp:function:: double getCacheSizeInMb()
.. cpp:function:: void setCacheSizeInMb(double v)
.. cpp:function:: double getStopEpsilon()
.. cpp:function:: void setStopEpsilon(double v)
.. cpp:function:: double getCost()
.. cpp:function:: void setCost(double v)
.. cpp:function:: double getNu()
.. cpp:function:: void setNu(double v)
.. cpp:function:: double getLossEpsilonSVR()
.. cpp:function:: void setLossEpsilonSVR(double v)
.. cpp:function:: bool getUseShrinking()
.. cpp:function:: void setUseShrinking(bool v)
.. cpp:function:: bool getProbabilityEstimates()
.. cpp:function:: void setProbabilityEstimates(bool v)
.. include:: links.rst
......@@ -31,6 +31,8 @@ extensions = [
'sphinx.ext.autosummary',
'sphinx.ext.doctest',
'sphinx.ext.intersphinx',
'breathe',
'sphinxcontrib.restbuilder',
]
# The viewcode extension appeared only on Sphinx >= 1.0.0
......@@ -281,5 +283,10 @@ intersphinx_mapping = {
numpy_manual: None,
}
# For Breathe
breathe_projects = {
'cxx': 'doc/xml',
}
def setup(app):
pass
# Doxyfile 1.8.5
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
# This tag specifies the encoding used for all characters in the config file
# that follow. The default is UTF-8 which is also the encoding used for all text
# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
# for the list of possible encodings.
# The default value is: UTF-8.
DOXYFILE_ENCODING = UTF-8
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
# double-quotes, unless you are using Doxywizard) that should identify the
# project for which the documentation is generated. This name is used in the
# title of most generated pages and in a few other places.
# The default value is: My Project.
PROJECT_NAME = "xbob.learn.libsvm Pure C/C++ API"
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER =
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.
PROJECT_BRIEF =
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
# the documentation. The maximum height of the logo should not exceed 55 pixels
# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
# to the output directory.
PROJECT_LOGO =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.
OUTPUT_DIRECTORY = doc
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
# will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
# performance problems for the file system.
# The default value is: NO.
CREATE_SUBDIRS = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
# Turkish, Ukrainian and Vietnamese.
# The default value is: English.
OUTPUT_LANGUAGE = English
# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.
BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
# description of a member or function before the detailed description
#
# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
# The default value is: YES.
REPEAT_BRIEF = YES
# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
# as the leading text of the brief description, will be stripped from the text
# and the result, after processing the whole list, is used as the annotated
# text. Otherwise, the brief description is used as-is. If left blank, the
# following values are used ($name is automatically replaced with the name of
# the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the.
ABBREVIATE_BRIEF =
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.
ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
# The default value is: NO.
INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.
FULL_PATH_NAMES = YES
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
# part of the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the path to
# strip.
#
# Note that you can specify absolute paths here, but also relative paths, which
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
STRIP_FROM_PATH =
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
# header file to include in order to use a class. If left blank only the name of
# the header file containing the class definition is used. Otherwise one should
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.
STRIP_FROM_INC_PATH =
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.
SHORT_NAMES = NO
# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
# first line (until the first dot) of a Javadoc-style comment as the brief
# description. If set to NO, the Javadoc-style will behave just like regular Qt-
# style comments (thus requiring an explicit @brief command for a brief
# description.)
# The default value is: NO.
JAVADOC_AUTOBRIEF = NO
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
# requiring an explicit \brief command for a brief description.)
# The default value is: NO.
QT_AUTOBRIEF = NO
# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
# a brief description. This used to be the default behavior. The new default is
# to treat a multi-line C++ comment block as a detailed description. Set this
# tag to YES if you prefer the old behavior instead.
#
# Note that setting this tag to YES also means that rational rose comments are
# not recognized any more.
# The default value is: NO.
MULTILINE_CPP_IS_BRIEF = NO
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.
INHERIT_DOCS = YES
# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
# new page for each member. If set to NO, the documentation of a member will be
# part of the file/class/namespace that contains it.
# The default value is: NO.
SEPARATE_MEMBER_PAGES = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.
TAB_SIZE = 4
# This tag can be used to specify a number of aliases that act as commands in
# the documentation. An alias has the form:
# name=value
# For example adding
# "sideeffect=@par Side Effects:\n"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines.
ALIASES =
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"
# will allow you to use the command class in the itcl::class meaning.
TCL_SUBST =
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
# members will be omitted, etc.
# The default value is: NO.
OPTIMIZE_OUTPUT_FOR_C = NO
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored
# for that language. For instance, namespaces will be presented as packages,
# qualified scopes will look different, etc.
# The default value is: NO.
OPTIMIZE_OUTPUT_JAVA = NO
# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.
OPTIMIZE_FOR_FORTRAN = NO
# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
# The default value is: NO.
OPTIMIZE_OUTPUT_VHDL = NO
# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
# (default is Fortran), use: inc=Fortran f=C.
#
# Note For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen.
EXTENSION_MAPPING =
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
# documentation. See http://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
# The default value is: YES.
MARKDOWN_SUPPORT = YES
# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by by putting a % sign in front of the word
# or globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES.
AUTOLINK_SUPPORT = YES
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
# tag to YES in order to let doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string);
# versus func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.
BUILTIN_STL_SUPPORT = NO
# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
# The default value is: NO.
CPP_CLI_SUPPORT = NO
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
# will parse them like normal C++ but will assume all classes use public instead
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.
SIP_SUPPORT = NO
# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
# doxygen to replace the get and set methods by a property in the documentation.
# This will only work if the methods are indeed getting or setting a simple
# type. If this is not the case, or you want to show the methods anyway, you
# should set this option to NO.
# The default value is: YES.
IDL_PROPERTY_SUPPORT = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES, then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
# The default value is: NO.
DISTRIBUTE_GROUP_DOC = NO
# Set the SUBGROUPING tag to YES to allow class member groups of the same type
# (for instance a group of public functions) to be put as a subgroup of that
# type (e.g. under the Public Functions section). Set it to NO to prevent
# subgrouping. Alternatively, this can be done per class using the
# \nosubgrouping command.
# The default value is: YES.
SUBGROUPING = YES
# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
# are shown inside the group in which they are included (e.g. using \ingroup)
# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
# and RTF).
#
# Note that this feature does not work in combination with
# SEPARATE_MEMBER_PAGES.
# The default value is: NO.
INLINE_GROUPED_CLASSES = NO
# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
# with only public data fields or simple typedef fields will be shown inline in
# the documentation of the scope in which they are defined (i.e. file,
# namespace, or group documentation), provided this scope is documented. If set
# to NO, structs, classes, and unions are shown on a separate page (for HTML and
# Man pages) or section (for LaTeX and RTF).
# The default value is: NO.
INLINE_SIMPLE_STRUCTS = NO
# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
# enum is documented as struct, union, or enum with the name of the typedef. So
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
# with name TypeT. When disabled the typedef will appear as a member of a file,
# namespace, or class. And the struct will be named TypeS. This can typically be
# useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
# The default value is: NO.
TYPEDEF_HIDES_STRUCT = NO
# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
# an expensive process and often the same symbol appears multiple times in the
# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
# doxygen will become slower. If the cache is too large, memory is wasted. The
# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
# symbols. At the end of a run doxygen will report the cache usage and suggest
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in