inspectable.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Robot Group Leipzig                             *
00003  *    martius@informatik.uni-leipzig.de                                    *
00004  *    fhesse@informatik.uni-leipzig.de                                     *
00005  *    der@informatik.uni-leipzig.de                                        *
00006  *    guettler@informatik.uni-leipzig.de                                   *
00007  *    joergweide84@aol.com (robot12)                                       *
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
00013  *                                                                         *
00014  *   This program is distributed in the hope that it will be useful,       *
00015  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00016  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00017  *   GNU General Public License for more details.                          *
00018  *                                                                         *
00019  *   You should have received a copy of the GNU General Public License     *
00020  *   along with this program; if not, write to the                         *
00021  *   Free Software Foundation, Inc.,                                       *
00022  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00023  *                                                                         *
00024  *   $Log: inspectable.h,v $
00025  *   Revision 1.8  2009/10/14 09:58:29  martius
00026  *   added support for description strings that are exported using the infolines
00027  *
00028  *   Revision 1.7  2009/08/10 07:37:48  guettler
00029  *   -Inspectable interface now supports to add infoLines itself.
00030  *    These lines are then outprinted line by line to the PlotOption once,
00031  *    preceded by a #I.
00032  *   -Restart functionality of PlotOptionEngine added (e.g. closePipes(), reInit()).
00033  *
00034  *   Revision 1.6  2009/08/05 08:19:23  martius
00035  *   addInspectableMatrix allows to specify optionally whether all or only 4x4+Diagonal is used
00036  *
00037  *   Revision 1.5  2009/07/15 13:01:15  robot12
00038  *   one bugfixe
00039  *
00040  *   Revision 1.4  2009/06/29 13:24:13  robot12
00041  *   add function getInternalParamsPtr for new class inspectableproxy
00042  *
00043  *   Revision 1.3  2008/08/01 14:42:03  guettler
00044  *   we try the trip to hell! make selforg AVR compatible...good luck (first changes)
00045  *
00046  *   Revision 1.2  2008/04/29 09:55:30  guettler
00047  *   -class uses now a list of pairs instead of a map
00048  *   -debug printouts removed
00049  *
00050  *   Revision 1.1  2008/04/29 07:39:24  guettler
00051  *   -interfaces moved to selforg/utils
00052  *   -added addInspectableValue and addInspectableMatrix
00053  *   -methods getInternalParamNames and getInternalParams do not need to be
00054  *   overloaded anymore, use addInspectableValue and addInspectableMatrix
00055  *   instead (preferred)
00056  *
00057  *   Revision 1.9  2006/12/21 11:44:17  martius
00058  *   commenting style for doxygen //< -> ///<
00059  *   FOREACH and FOREACHC are macros for collection iteration
00060  *
00061  *   Revision 1.8  2006/07/20 17:14:34  martius
00062  *   removed std namespace from matrix.h
00063  *   storable interface
00064  *   abstract model and invertablemodel as superclasses for networks
00065  *
00066  *   Revision 1.7  2006/07/14 12:23:58  martius
00067  *   selforg becomes HEAD
00068  *
00069  *   Revision 1.5.6.1  2006/06/25 16:51:35  martius
00070  *   configureable has name and revision
00071  *   a robot is configureable by default
00072  *
00073  *   Revision 1.5  2005/10/27 15:46:38  martius
00074  *   inspectable interface is expanded to structural information for network visualiser
00075  *
00076  *   Revision 1.4  2005/10/06 17:06:57  martius
00077  *   switched to stl lists
00078  *
00079  *   Revision 1.3  2005/09/11 11:20:01  martius
00080  *   virtual destructor
00081  *
00082  *   Revision 1.2  2005/08/06 20:47:54  martius
00083  *   Commented
00084  *
00085  *   Revision 1.1  2005/08/03 20:28:57  martius
00086  *   inspectable interface
00087  *
00088  *                                                                 *
00089  ***************************************************************************/
00090 #ifndef __INSPECTABLE_H
00091 #define __INSPECTABLE_H
00092 
00093 
00094 #include <list>
00095 #include <map>
00096 #include <utility>
00097 #include <string>
00098 #include "stl_adds.h"
00099 
00100 #include <iostream>
00101 
00102 namespace matrix {
00103   class Matrix;
00104 }
00105 
00106 /**
00107  * Interface for inspectable objects.
00108  * That means that one can read out some internal parameters indentified by string keys
00109 */
00110 class Inspectable {
00111 public:
00112 
00113   // TYPEDEFS BEGIN
00114 
00115   typedef std::string iparamkey;
00116   typedef double iparamval;
00117   typedef std::pair<iparamkey,iparamval*> iparampair;
00118 
00119   // the bool says whether  only 4x4AndDiag is used
00120   typedef std::pair<iparamkey,std::pair< matrix::Matrix*, bool > > imatrixpair; 
00121   typedef std::list<iparamkey> iparamkeylist;
00122   typedef std::list<iparamval> iparamvallist;
00123   typedef std::list<iparamval*> iparamvalptrlist;
00124   typedef std::list<iparampair> iparampairlist;
00125   typedef std::list<imatrixpair> imatrixpairlist;
00126 
00127   // the network stucture export will be discontinued soon
00128   typedef struct ILayer{
00129     ILayer(const std::string& vectorname, const std::string& biasname,
00130            int dimension, int rank, const std::string& layername)
00131       : vectorname(vectorname), biasname(biasname),
00132          dimension(dimension), rank(rank), layername(layername) {}
00133     std::string vectorname;  //< prefix of the internal parameter vector e.g. "v"
00134     std::string biasname;    ///< prefix of the internal parameter vector used as bias for the neurons e.g. "h"
00135     int dimension;      ///< length of the vector (number of units)
00136     int rank;           ///< rank of the layer (0 are input layers)
00137     std::string layername;   ///< name of the layer as displayed by the visualiser
00138   }ILayer;
00139 
00140   typedef struct IConnection{
00141     IConnection(const std::string& matrixname, const std::string& vector1, const std::string& vector2)
00142       : matrixname(matrixname), vector1(vector1), vector2(vector2) {}
00143     std::string matrixname; ///< matrix name is the prefix of the internal parameter matrix e.g. "A"
00144     std::string vector1;    ///< vectorname of input layer
00145     std::string vector2;    ///< vectorname of output layer
00146   }IConnection;
00147 
00148   typedef std::list<ILayer> ilayerlist;
00149   typedef std::list<IConnection> iconnectionlist;
00150 
00151   /// nice predicate function for finding a Layer with its vectorname
00152   struct matchName : public std::unary_function<ILayer, bool> {
00153     matchName(std::string name) : name(name) {}
00154     std::string name;
00155     bool operator()(ILayer l) { return l.vectorname == name; }
00156   };
00157 
00158 
00159 
00160   /// TYPEDEFS END
00161 
00162 
00163   Inspectable();
00164 
00165 
00166   virtual ~Inspectable();
00167 
00168 
00169   /** The list of the names of all internal parameters given by getInternalParams().
00170       The naming convention is "v[i]" for vectors
00171        and "A[i][j]" for matrices, where i, j start at 0.
00172       @return: list of keys
00173    */
00174   virtual iparamkeylist getInternalParamNames() const;
00175 
00176 
00177 /** @return: list of values
00178    */
00179   virtual iparamvallist getInternalParams() const;
00180 
00181   // should be protected, but it does not work
00182   /**
00183    * be careful: matrices will be ignored
00184    * @return list of values (pointer)
00185    */
00186   virtual iparamvalptrlist getInternalParamsPtr() const;
00187 
00188   /** Specifies which parameter vector forms a structural layer (in terms of a neural network)
00189       The ordering is important. The first entry is the input layer and so on.
00190       @return: list of layer names with dimension
00191 
00192    */
00193   virtual ilayerlist getStructuralLayers() const;
00194 
00195 
00196   /** Specifies which parameter matrix forms a connection between layers (in terms of a neural network)
00197       The orderning is not important.
00198       @return: list of layer names with dimension
00199    */
00200   virtual iconnectionlist getStructuralConnections() const;
00201 
00202 
00203   /**
00204    * This is the new style for adding inspectable values. Just call this
00205    * function for each parameter and you are done.
00206    * registers a single value
00207    * @param key the name of the inspectable, shown e.g. in guilogger (no spaces allowed)
00208    * @param val the address of the value to inspect
00209    * @param descr description string to be exported (using infolines)
00210    */
00211   virtual void addInspectableValue(const iparamkey& key, iparamval* val, 
00212                                    const std::string& descr = std::string());
00213 
00214 
00215   /**
00216    * This is the new style for adding inspectable values. Just call this
00217    * function for each parameter and you are done.
00218    * Inspects elements of the given matrix or vector (automatic detection)
00219    * For Matrixes Either all or only the values given by
00220    * store4x4AndDiagonalFieldNames(Matrix& m,string& matrixName);
00221    * are used.
00222    * @param key the name of the matrix, shown e.g. in guilogger (no spaces allowed)
00223    * @param m the address of the matrix to inspect
00224    * @param only4x4AndDiag of true only 4x4 matrix plus the diagonal is used 
00225    * @param descr description string to be exported 
00226    *              (for the entire matrix with key_) (using infolines)
00227    * @note that you can change the structure of the matrix while
00228    * being inspected, but no after the getInternalParameterNames is called!
00229    */
00230   virtual void addInspectableMatrix(const iparamkey& key, matrix::Matrix* m, 
00231                                     bool only4x4AndDiag=true, 
00232                                     const std::string& descr = std::string());
00233 
00234   /** 
00235    * adds a description for the given parameter using info-lines
00236    * The line will start (appart from the #I) with a D for description
00237    * followed by the key end then followed by the string.
00238    * @param key parameter name (no spaces allowed)
00239    * @param descr descriptive string (no newlines allowed)
00240    */
00241   virtual void addInspectableDescription(const iparamkey& key, const std::string& descr);
00242 
00243 
00244   /**
00245    * Adds an info line to this inspectable instance. All infolines are plotted
00246    * by the PlotOptionEngine and therefore appear e.g. in the logfile.
00247    * They are leaded by a #I. If you have your own identifiers, just begin with
00248    * your one (e.g. N for number of
00249    * NOTE: You must not add e.g. carriage return, all this is handled by the
00250    * PlotOptionsEngine itself.
00251    * If you like to add multiple lines, call this function a lot more or
00252    * use instead addInfoLines.
00253    * @param infoLine the line (as string) to be added
00254    */
00255   virtual void addInfoLine(std::string infoLine);
00256 
00257   /**
00258    * Adds a bunch of infolines with addInfoLine to this inspectable instance.
00259    * Every infoline is separated by an carriage return automatically, done
00260    * by the PlotOptionsEngine.
00261    * @param infoLineList the infoLines to be added as a string list.
00262    */
00263   virtual void addInfoLines(std::list<std::string> infoLineList);
00264 
00265   /**
00266    * Removes all infolines from this inspectable instance.
00267    * This is useful if you have new infoLines and would like to restart
00268    * the PlotOptionEngine.
00269    */
00270   virtual void removeInfoLines();
00271 
00272   /**
00273    * Returns all infolines added to this inspectable instance.
00274    * This function is called by the PlotOptionEngine.
00275    * @return all added infolines.
00276    */
00277   virtual const std::list<std::string>& getInfoLines() const;
00278 
00279 protected:
00280   iparampairlist mapOfValues;
00281   imatrixpairlist mapOfMatrices;
00282 
00283   std::list<std::string> infoLineStringList;
00284 
00285 
00286 };
00287 
00288 #endif

Generated on Fri Oct 30 16:29:01 2009 for Robot Simulator of the Robotics Group for Self-Organization of Control by  doxygen 1.4.7