PLearn 0.1
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 3994 2005-08-25 13:35:03Z chapados $
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 
00179 /*
00180   Local Variables:
00181   mode:c++
00182   c-basic-offset:4
00183   c-file-style:"stroustrup"
00184   c-file-offsets:((innamespace . 0)(inline-open . 0))
00185   indent-tabs-mode:nil
00186   fill-column:79
00187   End:
00188 */
00189 // 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