PLearn 0.1
ThresholdBpropVariable.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // PLearn (A C++ Machine Learning Library)
00004 // Copyright (C) 1998 Pascal Vincent
00005 // Copyright (C) 1999-2002 Pascal Vincent, Yoshua Bengio, Rejean Ducharme and University of Montreal
00006 // Copyright (C) 2001-2002 Nicolas Chapados, Ichiro Takeuchi, Jean-Sebastien Senecal
00007 // Copyright (C) 2002 Xiangdong Wang, Christian Dorion
00008 
00009 // Redistribution and use in source and binary forms, with or without
00010 // modification, are permitted provided that the following conditions are met:
00011 // 
00012 //  1. Redistributions of source code must retain the above copyright
00013 //     notice, this list of conditions and the following disclaimer.
00014 // 
00015 //  2. Redistributions in binary form must reproduce the above copyright
00016 //     notice, this list of conditions and the following disclaimer in the
00017 //     documentation and/or other materials provided with the distribution.
00018 // 
00019 //  3. The name of the authors may not be used to endorse or promote
00020 //     products derived from this software without specific prior written
00021 //     permission.
00022 // 
00023 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
00024 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00025 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
00026 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00027 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00028 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00029 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00030 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00031 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00032 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 // 
00034 // This file is part of the PLearn library. For more information on the PLearn
00035 // library, go to the PLearn Web site at www.plearn.org
00036 
00037 
00038 /* *******************************************************      
00039  * $Id: ThresholdBpropVariable.cc 3994 2005-08-25 13:35:03Z chapados $
00040  * This file is part of the PLearn library.
00041  ******************************************************* */
00042 
00043 #include "ThresholdBpropVariable.h"
00044 
00045 
00046 namespace PLearn {
00047 using namespace std;
00048 
00049 
00050 
00053 PLEARN_IMPLEMENT_OBJECT(ThresholdBpropVariable,
00054                         "Variable that copies its input but imposes\n"
00055                         "a threshold on the gradient flow.",
00056                         "In its fprop it simply copies its unique input variable.\n"
00057                         "In for bprop, it multiplies the fprop value by the\n"
00058                         "gradient_threshold_factor option to obtain the threshold,\n"
00059                         "beyond which the gradient is fixed.\n");
00060 
00061 ThresholdBpropVariable::ThresholdBpropVariable(Variable* input, real the_gradient_threshold_factor)
00062     : inherited(input, input->length(), input->width()),
00063       gradient_threshold_factor(the_gradient_threshold_factor)
00064 {
00065     build_();
00066 }
00067 
00068 void
00069 ThresholdBpropVariable::build()
00070 {
00071     inherited::build();
00072     build_();
00073 }
00074 
00075 void
00076 ThresholdBpropVariable::build_()
00077 {
00078 }
00079 
00080 void
00081 ThresholdBpropVariable::declareOptions(OptionList &ol)
00082 {
00083     declareOption(ol, "gradient_threshold_factor", &ThresholdBpropVariable::gradient_threshold_factor, 
00084                   OptionBase::buildoption, "Factor by which the value of the variable is multiplied to obtain the absolute threshold\n"
00085                   "on the gradient.");
00086     inherited::declareOptions(ol);
00087 }
00088 
00089 void ThresholdBpropVariable::recomputeSize(int& l, int& w) const
00090 {
00091     if (input) {
00092         l = input->length();
00093         w = input->width();
00094     } else
00095         l = w = 0;
00096 }
00097 
00098 void ThresholdBpropVariable::fprop()
00099 {
00100     for(int k=0; k<input->nelems(); k++)
00101         valuedata[k] = input->valuedata[k];
00102 }
00103 
00104 
00105 void ThresholdBpropVariable::bprop()
00106 {
00107     if(gradient_threshold_factor!=0)
00108     {
00109         for(int k=0; k<input->nelems(); k++)
00110             if(abs(gradientdata[k]) > abs(gradient_threshold_factor * input->valuedata[k]))
00111                 input->gradientdata[k] += abs(gradient_threshold_factor * input->valuedata[k]) * (gradientdata[k]>0 ? 1 : -1);
00112             else
00113                 input->gradientdata[k] += gradientdata[k];
00114     }
00115 }
00116 
00117 } // end of namespace PLearn
00118 
00119 
00120 /*
00121   Local Variables:
00122   mode:c++
00123   c-basic-offset:4
00124   c-file-style:"stroustrup"
00125   c-file-offsets:((innamespace . 0)(inline-open . 0))
00126   indent-tabs-mode:nil
00127   fill-column:79
00128   End:
00129 */
00130 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines