PLearn 0.1
Max2Variable.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: Max2Variable.cc 6437 2006-11-16 14:08:37Z chapados $
00040  * This file is part of the PLearn library.
00041  ******************************************************* */
00042 
00043 #include "Max2Variable.h"
00044 #include "Var_operators.h"
00045 
00046 namespace PLearn {
00047 using namespace std;
00048 
00049 
00053 PLEARN_IMPLEMENT_OBJECT(
00054     Max2Variable,
00055     "Elementwise maximum over two source variables",
00056     "This variable assumes that the source variables have the same dimensionality\n"
00057     "and it takes that dimensionality.  Its values are defined as the element-wise\n"
00058     "maximum between its source variables:\n"
00059     "\n"
00060     "  max(v1,v2)[i] = max(v1[i],v2[i])\n"
00061     "\n"
00062     "with same dimensions as the input vectors");
00063 
00064 Max2Variable::Max2Variable(Variable* input1, Variable* input2)
00065     : inherited(input1, input2, input1->length(), input1->width())
00066 {
00067     PLASSERT( input1 && input2 );
00068     build_();
00069 }
00070 
00071 void
00072 Max2Variable::build()
00073 {
00074     inherited::build();
00075     build_();
00076 }
00077 
00078 void
00079 Max2Variable::build_()
00080 {
00081     if (input1 && input2) {
00082         if (input1->length() != input2->length()  ||  input1->width() != input2->width())
00083             PLERROR("IN Max2Variable input1 and input2 must have the same size");
00084     }
00085 }
00086 
00087 
00088 void Max2Variable::recomputeSize(int& l, int& w) const
00089 {
00090     if (input1) {
00091         l = input1->length();
00092         w = input1->width();
00093     } else
00094         l = w = 0;
00095 }
00096 
00097 void Max2Variable::fprop()
00098 {
00099     PLASSERT( input1 && input2 );
00100     int n=input1->value.length();
00101     real* v1=input1->value.data();
00102     real* v2=input2->value.data();
00103     real* v=value.data();
00104     for (int i=0;i<n;i++)
00105         v[i] = std::max(v1[i],v2[i]);
00106 }
00107 
00108 
00109 void Max2Variable::bprop()
00110 {
00111     PLASSERT( input1 && input2 );
00112     int n=input1->value.length();
00113     real* v1=input1->value.data();
00114     real* v2=input2->value.data();
00115     real* grad1=input1->gradient.data();
00116     real* grad2=input2->gradient.data();
00117     real* grad=gradient.data();
00118     for (int i=0;i<n;i++)
00119     {
00120         if (v2[i]<v1[i])
00121             grad1[i] += grad[i];
00122         if (v1[i]<v2[i])
00123             grad2[i] += grad[i];
00124     }
00125 }
00126 
00127 
00128 void Max2Variable::symbolicBprop()
00129 {
00130     PLASSERT( input1 && input2 );
00131     input1->accg((input2<input1)*g);
00132     input2->accg((input1<input2)*g);
00133 }
00134 
00135 
00136 
00137 } // end of namespace PLearn
00138 
00139 
00140 /*
00141   Local Variables:
00142   mode:c++
00143   c-basic-offset:4
00144   c-file-style:"stroustrup"
00145   c-file-offsets:((innamespace . 0)(inline-open . 0))
00146   indent-tabs-mode:nil
00147   fill-column:79
00148   End:
00149 */
00150 // 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