Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

ExtendedVariable.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: ExtendedVariable.cc,v 1.5 2004/04/27 16:03:35 morinf Exp $ 00040 * This file is part of the PLearn library. 00041 ******************************************************* */ 00042 00043 #include "ExtendedVariable.h" 00044 #include "SubMatVariable.h" 00045 00046 namespace PLearn { 00047 using namespace std; 00048 00049 00050 00053 PLEARN_IMPLEMENT_OBJECT(ExtendedVariable, 00054 "Variable that extends the input variable by appending rows at " 00055 "its top and bottom and columns at its left and right.", 00056 "NO HELP"); 00057 00058 ExtendedVariable::ExtendedVariable(Variable* input, int the_top_extent, int the_bottom_extent, 00059 int the_left_extent, int the_right_extent, real the_fill_value) 00060 : inherited(input, input->length()+the_top_extent+the_bottom_extent, input->width()+the_left_extent+the_right_extent), 00061 top_extent(the_top_extent), bottom_extent(the_bottom_extent), 00062 left_extent(the_left_extent), right_extent(the_right_extent), 00063 fill_value(the_fill_value) 00064 { 00065 build_(); 00066 } 00067 00068 void 00069 ExtendedVariable::build() 00070 { 00071 inherited::build(); 00072 build_(); 00073 } 00074 00075 void 00076 ExtendedVariable::build_() 00077 { 00078 if(top_extent<0 || bottom_extent<0 || left_extent<0 || right_extent<0) 00079 PLERROR("In ExtendedVariable: given extents must be >=0"); 00080 for(int k=0; k<nelems(); k++) 00081 valuedata[k] = fill_value; 00082 } 00083 00084 void 00085 ExtendedVariable::declareOptions(OptionList &ol) 00086 { 00087 declareOption(ol, "top_extent", &ExtendedVariable::top_extent, OptionBase::buildoption, ""); 00088 declareOption(ol, "bottom_extent", &ExtendedVariable::bottom_extent, OptionBase::buildoption, ""); 00089 declareOption(ol, "left_extent", &ExtendedVariable::left_extent, OptionBase::buildoption, ""); 00090 declareOption(ol, "right_extent", &ExtendedVariable::right_extent, OptionBase::buildoption, ""); 00091 declareOption(ol, "fill_value", &ExtendedVariable::fill_value, OptionBase::buildoption, ""); 00092 inherited::declareOptions(ol); 00093 } 00094 00095 void ExtendedVariable::recomputeSize(int& l, int& w) const 00096 { 00097 if (input) { 00098 l = input->length() + top_extent + bottom_extent; 00099 w = input->width() + left_extent + right_extent; 00100 } else 00101 l = w = 0; 00102 } 00103 00104 void ExtendedVariable::fprop() 00105 { 00106 if(width()==input->width()) // optimized code for this special case (no left or right extents) 00107 { 00108 real* data = valuedata+top_extent*width(); 00109 for(int k=0; k<input->nelems(); k++) 00110 data[k] = input->valuedata[k]; 00111 } 00112 else // general case 00113 { 00114 real* rowdata=valuedata+top_extent*width()+left_extent; 00115 int inputk=0; 00116 for(int i=0; i<input->length(); i++) 00117 { 00118 for(int j=0; j<input->width(); j++) 00119 rowdata[j] = input->valuedata[inputk++]; 00120 rowdata += width(); 00121 } 00122 } 00123 } 00124 00125 00126 void ExtendedVariable::bprop() 00127 { 00128 if(width()==input->width()) // optimized code for this special case (no left or right extents) 00129 { 00130 real* data = gradientdata+top_extent*width(); 00131 for(int k=0; k<input->nelems(); k++) 00132 input->gradientdata[k] += data[k]; 00133 } 00134 else // general case 00135 { 00136 real* rowdata = gradientdata+top_extent*width()+left_extent; 00137 int inputk = 0; 00138 for(int i=0; i<input->length(); i++) 00139 { 00140 for(int j=0; j<input->width(); j++) 00141 input->gradientdata[inputk++] += rowdata[j]; 00142 rowdata += width(); 00143 } 00144 } 00145 } 00146 00147 00148 void ExtendedVariable::symbolicBprop() 00149 { 00150 input->accg(new SubMatVariable(g,top_extent,left_extent,input->length(),input->width())); 00151 } 00152 00153 00154 void ExtendedVariable::rfprop() 00155 { 00156 if (rValue.length()==0) resizeRValue(); 00157 if(width()==input->width()) // optimized code for this special case (no left or right extents) 00158 { 00159 real* data = rvaluedata+top_extent*width(); 00160 for(int k=0; k<input->nelems(); k++) 00161 data[k] = input->rvaluedata[k]; 00162 } 00163 else // general case 00164 { 00165 real* rowdata=rvaluedata+top_extent*width()+left_extent; 00166 int inputk=0; 00167 for(int i=0; i<input->length(); i++) 00168 { 00169 for(int j=0; j<input->width(); j++) 00170 rowdata[j] = input->rvaluedata[inputk++]; 00171 rowdata += width(); 00172 } 00173 } 00174 } 00175 00176 } // end of namespace PLearn 00177 00178

Generated on Tue Aug 17 15:52:38 2004 for PLearn by doxygen 1.3.7