PLearn 0.1
|
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 :