nnfw/include/liboutputfunctions.h
Go to the documentation of this file.
00001 /******************************************************************************** 00002 * Neural Network Framework. * 00003 * Copyright (C) 2005-2011 Gianluca Massera <emmegian@yahoo.it> * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU General Public License as published by * 00007 * the Free Software Foundation; either version 2 of the License, or * 00008 * (at your option) any later version. * 00009 * * 00010 * This program is distributed in the hope that it will be useful, * 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00013 * GNU General Public License for more details. * 00014 * * 00015 * You should have received a copy of the GNU General Public License * 00016 * along with this program; if not, write to the Free Software * 00017 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 00018 ********************************************************************************/ 00019 00020 #ifndef LIBOUTPUTFUNCTIONS_H 00021 #define LIBOUTPUTFUNCTIONS_H 00022 00023 #include "nnfwconfig.h" 00024 00030 #include "outputfunction.h" 00031 #include <configurationparameters.h> 00032 #include <memory> 00033 00034 namespace farsa { 00035 00040 class FARSA_NNFW_API IdentityFunction : public OutputFunction { 00041 public: 00043 IdentityFunction(); 00045 virtual ~IdentityFunction() { /* Nothing to do */ }; 00047 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00049 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00060 virtual void configure(ConfigurationParameters& params, QString prefix); 00068 virtual void save(ConfigurationParameters& params, QString prefix); 00069 }; 00070 00075 class FARSA_NNFW_API ScaleFunction : public OutputFunction { 00076 public: 00078 ScaleFunction( double rate = 1.0 ); 00080 virtual ~ScaleFunction() { /* Nothing to do */ }; 00082 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00084 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00095 virtual void configure(ConfigurationParameters& params, QString prefix); 00103 virtual void save(ConfigurationParameters& params, QString prefix); 00104 double rate; 00105 }; 00106 00111 class FARSA_NNFW_API GainFunction : public OutputFunction { 00112 public: 00114 GainFunction( double gain = 1.0 ); 00116 virtual ~GainFunction() { /* Nothing to do */ }; 00118 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00120 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00131 virtual void configure(ConfigurationParameters& params, QString prefix); 00139 virtual void save(ConfigurationParameters& params, QString prefix); 00140 double gainv; 00141 }; 00142 00147 class FARSA_NNFW_API SigmoidFunction : public OutputFunction { 00148 public: 00150 SigmoidFunction( double l = 1.0 ); 00152 virtual ~SigmoidFunction() { /* Nothing to do */ }; 00154 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00156 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00167 virtual void configure(ConfigurationParameters& params, QString prefix); 00175 virtual void save(ConfigurationParameters& params, QString prefix); 00177 double lambda; 00178 }; 00179 00183 class FARSA_NNFW_API FakeSigmoidFunction : public OutputFunction { 00184 public: 00186 FakeSigmoidFunction( double l = 1.0 ); 00188 virtual ~FakeSigmoidFunction() { /* Nothing to do */ }; 00190 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00192 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00203 virtual void configure(ConfigurationParameters& params, QString prefix); 00211 virtual void save(ConfigurationParameters& params, QString prefix); 00213 double lambda; 00214 }; 00215 00224 class FARSA_NNFW_API ScaledSigmoidFunction : public OutputFunction { 00225 public: 00227 ScaledSigmoidFunction( double l = 1.0, double min = -1.0, double max = +1.0 ); 00229 virtual ~ScaledSigmoidFunction() { /* Nothing to do */ }; 00231 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00233 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00244 virtual void configure(ConfigurationParameters& params, QString prefix); 00252 virtual void save(ConfigurationParameters& params, QString prefix); 00254 double lambda; 00256 double min; 00258 double max; 00259 }; 00260 00277 class FARSA_NNFW_API RampFunction : public OutputFunction { 00278 public: 00280 RampFunction(); 00282 RampFunction( double minX, double maxX, double minY = -1, double maxY = +1 ); 00284 virtual ~RampFunction() { /* Nothing to do */ }; 00286 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00288 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00299 virtual void configure(ConfigurationParameters& params, QString prefix); 00307 virtual void save(ConfigurationParameters& params, QString prefix); 00309 double min_x; 00311 double max_x; 00313 double min_y; 00315 double max_y; 00316 }; 00317 00324 class FARSA_NNFW_API LinearFunction : public OutputFunction { 00325 public: 00327 LinearFunction(); 00329 LinearFunction( double m, double b ); 00331 virtual ~LinearFunction() { /* Nothing to do */ }; 00333 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00335 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00346 virtual void configure(ConfigurationParameters& params, QString prefix); 00354 virtual void save(ConfigurationParameters& params, QString prefix); 00356 double m; 00358 double b; 00359 }; 00360 00366 class FARSA_NNFW_API StepFunction : public OutputFunction { 00367 public: 00369 StepFunction( double min = 0.0f, double max = 1.0f, double threshold = 0.0f ); 00371 virtual ~StepFunction() { /* Nothing to do */ }; 00373 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00375 virtual bool derivate( const DoubleVector& x, const DoubleVector& y, DoubleVector& d ) const; 00386 virtual void configure(ConfigurationParameters& params, QString prefix); 00394 virtual void save(ConfigurationParameters& params, QString prefix); 00396 double min; 00398 double max; 00400 double threshold; 00401 }; 00402 00406 class FARSA_NNFW_API LeakyIntegratorFunction : public OutputFunction { 00407 public: 00409 LeakyIntegratorFunction(); 00411 LeakyIntegratorFunction( const DoubleVector& deltas ); 00413 virtual ~LeakyIntegratorFunction() { /* Nothing to do */ }; 00415 void zeroingStatus(); 00419 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00421 virtual void clusterSetted(); 00432 virtual void configure(ConfigurationParameters& params, QString prefix); 00440 virtual void save(ConfigurationParameters& params, QString prefix); 00442 DoubleVector delta; 00444 DoubleVector outprev; 00445 }; 00446 00455 class FARSA_NNFW_API LogLikeFunction : public OutputFunction { 00456 public: 00458 LogLikeFunction( double A=1.0, double B=5.0 ); 00460 virtual ~LogLikeFunction() { /* Nothing to do */ }; 00462 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00473 virtual void configure(ConfigurationParameters& params, QString prefix); 00481 virtual void save(ConfigurationParameters& params, QString prefix); 00483 double A; 00485 double B; 00486 }; 00487 00493 class FARSA_NNFW_API CompositeFunction : public OutputFunction { 00494 public: 00496 CompositeFunction(); 00498 CompositeFunction( OutputFunction *f, OutputFunction *g ); 00500 virtual ~CompositeFunction(); 00502 bool setFirstFunction( OutputFunction *f ); 00504 OutputFunction* getFirstFunction(); 00506 bool setSecondFunction( OutputFunction *g ); 00508 OutputFunction* getSecondFunction(); 00513 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00515 virtual void clusterSetted(); 00526 virtual void configure(ConfigurationParameters& params, QString prefix); 00534 virtual void save(ConfigurationParameters& params, QString prefix); 00535 private: 00537 std::auto_ptr<OutputFunction> first; 00539 std::auto_ptr<OutputFunction> second; 00541 DoubleVector mid; 00543 CompositeFunction(const CompositeFunction&); 00544 CompositeFunction& operator=(const CompositeFunction&); 00545 }; 00546 00553 class FARSA_NNFW_API LinearComboFunction : public OutputFunction { 00554 public: 00556 LinearComboFunction(); 00558 LinearComboFunction( double w1, OutputFunction *f, double w2, OutputFunction *g ); 00560 virtual ~LinearComboFunction(); 00562 bool setFirstFunction( OutputFunction *f ); 00564 OutputFunction* getFirstFunction(); 00566 bool setFirstWeight( double v ); 00568 double getFirstWeight(); 00570 bool setSecondFunction( OutputFunction *g ); 00572 OutputFunction* getSecondFunction(); 00574 bool setSecondWeight( double v ); 00576 double getSecondWeight(); 00580 virtual void apply( DoubleVector& inputs, DoubleVector& outputs ); 00582 virtual void clusterSetted(); 00593 virtual void configure(ConfigurationParameters& params, QString prefix); 00601 virtual void save(ConfigurationParameters& params, QString prefix); 00602 private: 00603 //--- functions 00604 std::auto_ptr<OutputFunction> first; 00605 std::auto_ptr<OutputFunction> second; 00606 //--- temporary result 00607 DoubleVector mid; 00608 //--- weights 00609 double w1, w2; 00610 // Copy constructor and copy operator (here to prevent usage) 00611 LinearComboFunction(const LinearComboFunction&); 00612 LinearComboFunction& operator=(const LinearComboFunction&); 00613 }; 00614 00615 } 00616 00617 #endif