include/liboutputfunctions.h

Go to the documentation of this file.
00001 /********************************************************************************
00002  *  Neural Network Framework.                                                   *
00003  *  Copyright (C) 2005-2008 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 "types.h"
00024 
00032 #include "outputfunction.h"
00033 #include "derivableoutputfunction.h"
00034 
00035 
00036 namespace nnfw {
00037 
00048 class NNFW_API IdentityFunction : public DerivableOutputFunction {
00049 public:
00052 
00054     IdentityFunction();
00055 
00057     IdentityFunction( PropertySettings& prop );
00058 
00060     virtual ~IdentityFunction() { /* Nothing to do */ };
00061 
00063 
00065 
00067     virtual void apply( RealVec& inputs, RealVec& outputs );
00068 
00070     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00071 
00074     virtual IdentityFunction* clone() const;
00075 
00077 };
00078 
00090 class NNFW_API ScaleFunction : public OutputFunction {
00091 public:
00094 
00096     ScaleFunction( Real rate = 1.0 );
00097 
00099     ScaleFunction( PropertySettings& prop );
00100 
00102     virtual ~ScaleFunction() { /* Nothing to do */ };
00103 
00105 
00107 
00110     bool setRate( const Variant& v );
00111 
00114     Variant getRate();
00115 
00117     virtual void apply( RealVec& inputs, RealVec& outputs );
00118 
00121     virtual ScaleFunction* clone() const;
00122 
00124 private:
00125     Real rate;
00126 };
00127 
00139 class NNFW_API GainFunction : public OutputFunction {
00140 public:
00143     
00145     GainFunction( Real gain = 1.0 );
00146     
00148     GainFunction( PropertySettings& prop );
00149     
00151     virtual ~GainFunction() { /* Nothing to do */ };
00152     
00154 
00156     
00158     bool setGain( const Variant& v );
00159     
00161     Variant gain();
00162     
00164     virtual void apply( RealVec& inputs, RealVec& outputs );
00165     
00167     virtual GainFunction* clone() const;
00168     
00170 private:
00171     Real gainv;
00172 };
00173 
00185 class NNFW_API SigmoidFunction : public DerivableOutputFunction {
00186 public:
00189 
00191     SigmoidFunction( Real l = 1.0 );
00192 
00194     SigmoidFunction( PropertySettings& prop );
00195 
00197     virtual ~SigmoidFunction() { /* Nothing to do */ };
00198 
00200 
00202 
00205     bool setLambda( const Variant& v );
00206 
00209     Variant getLambda();
00210 
00213     virtual void apply( RealVec& inputs, RealVec& outputs );
00214 
00216     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00217 
00220     virtual SigmoidFunction* clone() const;
00221 
00223 private:
00225     Real lambda;
00226 };
00227 
00239 class NNFW_API FakeSigmoidFunction : public DerivableOutputFunction {
00240 public:
00243 
00245     FakeSigmoidFunction( Real l = 1.0 );
00246 
00248     FakeSigmoidFunction( PropertySettings& prop );
00249 
00251     virtual ~FakeSigmoidFunction() { /* Nothing to do */ };
00252 
00254 
00256 
00259     bool setLambda( const Variant& v );
00260 
00263     Variant getLambda();
00264 
00267     virtual void apply( RealVec& inputs, RealVec& outputs );
00268 
00270     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00271 
00274     virtual FakeSigmoidFunction* clone() const;
00275 
00277 
00279     Real lambda;
00280 };
00281 
00298 class NNFW_API ScaledSigmoidFunction : public DerivableOutputFunction {
00299 public:
00302 
00304     ScaledSigmoidFunction( Real l = 1.0, Real min = -1.0, Real max = +1.0 );
00305 
00307     ScaledSigmoidFunction( PropertySettings& prop );
00308 
00310     virtual ~ScaledSigmoidFunction() { /* Nothing to do */ };
00311 
00313 
00315 
00318     bool setLambda( const Variant& v );
00319 
00322     Variant getLambda();
00323 
00326     bool setMin( const Variant& v );
00327 
00330     Variant getMin();
00331 
00334     bool setMax( const Variant& v );
00335 
00338     Variant getMax();
00339 
00342     virtual void apply( RealVec& inputs, RealVec& outputs );
00343 
00345     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00346 
00349     virtual ScaledSigmoidFunction* clone() const;
00350 
00352 
00354     Real lambda;
00356     Real min;
00358     Real max;
00359 };
00360 
00386 class NNFW_API RampFunction : public DerivableOutputFunction {
00387 public:
00390     
00392     RampFunction( Real minX, Real maxX, Real minY = -1, Real maxY = +1 );
00393     
00395     RampFunction( PropertySettings& prop );
00396     
00398     virtual ~RampFunction() { /* Nothing to do */ };
00399     
00401 
00403     
00405     bool setMinX( const Variant& v );
00406     
00408     Variant minX();
00409     
00411     bool setMaxX( const Variant& v );
00412     
00414     Variant maxX();
00415     
00417     bool setMinY( const Variant& v );
00418     
00420     Variant minY();
00421     
00423     bool setMaxY( const Variant& v );
00424     
00426     Variant maxY();
00427     
00430     virtual void apply( RealVec& inputs, RealVec& outputs );
00431     
00433     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00434     
00436     virtual RampFunction* clone() const;
00437     
00439     
00441     Real min_x;
00443     Real max_x;
00445     Real min_y;
00447     Real max_y;
00448 };
00449 
00465 class NNFW_API LinearFunction : public DerivableOutputFunction {
00466 public:
00469     
00471     LinearFunction( Real m, Real b );
00472     
00474     LinearFunction( PropertySettings& prop );
00475     
00477     virtual ~LinearFunction() { /* Nothing to do */ };
00478     
00480 
00482     
00484     bool setM( const Variant& v );
00485     
00487     Variant m();
00488     
00490     bool setB( const Variant& v );
00491     
00493     Variant b();
00494     
00496     virtual void apply( RealVec& inputs, RealVec& outputs );
00497     
00499     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00500     
00502     virtual LinearFunction* clone() const;
00503     
00505     
00507     Real mv;
00509     Real bv;
00510 };
00511 
00525 class NNFW_API StepFunction : public DerivableOutputFunction {
00526 public:
00529 
00531     StepFunction( Real min = 0.0f, Real max = 1.0f, Real threshold = 0.0f );
00532 
00534     StepFunction( PropertySettings& prop );
00535 
00537     virtual ~StepFunction() { /* Nothing to do */ };
00538 
00540 
00542 
00545     bool setMin( const Variant& v );
00546 
00549     Variant getMin();
00550 
00553     bool setMax( const Variant& v );
00554 
00557     Variant getMax();
00558 
00561     bool setThreshold( const Variant& v );
00562 
00565     Variant getThreshold();
00566 
00569     virtual void apply( RealVec& inputs, RealVec& outputs );
00570 
00572     virtual void derivate( const RealVec& x, const RealVec& y, RealVec& d ) const;
00573 
00576     virtual StepFunction* clone() const;
00577 
00579 
00581     Real min;
00583     Real max;
00585     Real threshold;
00586 };
00587 
00599 class NNFW_API LeakyIntegratorFunction : public OutputFunction {
00600 public:
00603 
00605     LeakyIntegratorFunction( const RealVec& d );
00606 
00608     LeakyIntegratorFunction( PropertySettings& prop );
00609 
00611     virtual ~LeakyIntegratorFunction() { /* Nothing to do */ };
00612 
00614 
00616 
00618     RealVec& getDelta() {
00619         return delta;
00620     };
00621 
00623     void setDelta( const RealVec& v ) {
00624         delta.assign( v );
00625     };
00626 
00628     Variant getDeltaV();
00629 
00631     bool setDeltaV( const Variant& v );
00632 
00634     void zeroingStatus();
00635 
00639     virtual void apply( RealVec& inputs, RealVec& outputs );
00640 
00642     virtual LeakyIntegratorFunction* clone() const;
00643 
00645     virtual void setCluster( Cluster* );
00646 
00648 
00650     RealVec delta;
00652     RealVec outprev;
00653 };
00654 
00670 class NNFW_API LogLikeFunction : public OutputFunction {
00671 public:
00674 
00676     LogLikeFunction( Real A=1.0, Real B=5.0 );
00677 
00679     LogLikeFunction( PropertySettings& prop );
00680 
00682     virtual ~LogLikeFunction() { /* Nothing to do */ };
00683 
00685 
00687 
00689     Real A() {
00690         return a;
00691     };
00692 
00694     void setA( Real na ) {
00695         a = na;
00696     };
00697 
00699     Variant getAV();
00700 
00702     bool setAV( const Variant& v );
00703 
00705     Real B() {
00706         return b;
00707     };
00708 
00710     void setB( Real nb ) {
00711         b = nb;
00712     };
00713 
00715     Variant getBV();
00716 
00718     bool setBV( const Variant& v );
00719 
00721     virtual void apply( RealVec& inputs, RealVec& outputs );
00722 
00724     virtual LogLikeFunction* clone() const;
00725 
00727 
00728 private:
00730     Real a;
00732     Real b;
00733 };
00734 
00749 class NNFW_API PoolFunction : public OutputFunction {
00750 public:
00753 
00756     PoolFunction( const OutputFunction& prototype, u_int dim );
00757 
00759     PoolFunction( PropertySettings& prop );
00760 
00763     PoolFunction( u_int dim = 1 );
00764 
00767     ~PoolFunction();
00768 
00770 
00772 
00775     OutputFunction* getOutputFunction( u_int i );
00776 
00779     void setOutputFunction( u_int i, const OutputFunction& prototype );
00780 
00783     Variant getOutputFunctionV( u_int i );
00784 
00787     bool setOutputFunction( u_int i, const Variant& prototype );
00788 
00791     unsigned int size();
00792 
00795     Variant sizeV();
00796 
00800     virtual void apply( RealVec& inputs, RealVec& outputs );
00801 
00804     virtual PoolFunction* clone() const;
00805 
00808     virtual void setCluster( Cluster* );
00809 
00811 
00812 private:
00814     VectorData<OutputFunction*> ups;
00815 };
00816 
00817 
00818 
00831 class NNFW_API CompositeFunction : public OutputFunction {
00832 public:
00835 
00837     CompositeFunction( const OutputFunction& f, const OutputFunction& g );
00838 
00840     CompositeFunction( PropertySettings& prop );
00841 
00843     virtual ~CompositeFunction();
00844 
00846 
00848 
00850     bool setFirstFunction( const Variant& v );
00851 
00853     Variant getFirstFunction();
00854 
00856     bool setSecondFunction( const Variant& v );
00857 
00859     Variant getSecondFunction();
00860 
00865     virtual void apply( RealVec& inputs, RealVec& outputs );
00866 
00868     virtual CompositeFunction* clone() const;
00869 
00871     virtual void setCluster( Cluster* );
00872 
00874 
00875     //--- functions
00876     OutputFunction* first;
00877     OutputFunction* second;
00878     //--- intermediate result
00879     RealVec mid;
00880     //--- Cluster
00881     Cluster* cl;
00882 };
00883 
00898 class NNFW_API LinearComboFunction : public OutputFunction {
00899 public:
00902 
00904     LinearComboFunction( Real w1, const OutputFunction& f, Real w2, const OutputFunction& g );
00905 
00907     LinearComboFunction( PropertySettings& prop );
00908 
00910     virtual ~LinearComboFunction();
00911 
00913 
00915 
00917     bool setFirstFunction( const Variant& v );
00919     Variant getFirstFunction();
00921     bool setFirstWeight( const Variant& v );
00923     Variant getFirstWeight();
00924 
00926     bool setSecondFunction( const Variant& v );
00928     Variant getSecondFunction();
00930     bool setSecondWeight( const Variant& v );
00932     Variant getSecondWeight();
00933 
00937     virtual void apply( RealVec& inputs, RealVec& outputs );
00938 
00940     virtual LinearComboFunction* clone() const;
00942     virtual void setCluster( Cluster* );
00943 
00945 
00946     //--- functions
00947     OutputFunction* first;
00948     OutputFunction* second;
00949     //--- temporary result
00950     RealVec mid;
00951     //--- weights
00952     Real w1, w2;
00953     //--- Cluster
00954     Cluster* cl;
00955 };
00956 
00957 }
00958 
00959 #endif
00960 
00961 
BerliOS Developer Logo Valid XHTML 1.0 Transitional Valid CSS!