PLearn 0.1
BiasWeightAffineTransformVariable.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: BiasWeightAffineTransformVariable.cc 3994 2005-08-25 13:35:03Z chapados $
00040  * This file is part of the PLearn library.
00041  ******************************************************* */
00042 
00043 #include "BiasWeightAffineTransformVariable.h"
00044 #include <plearn/math/TMat_maths.h>
00045 
00046 namespace PLearn {
00047 using namespace std;
00048 
00049 
00050 PLEARN_IMPLEMENT_OBJECT(BiasWeightAffineTransformVariable,
00051                         "Affine transformation of a vector variable, from a weight and bias variable.",
00052                         "NO HELP");
00053 
00054 BiasWeightAffineTransformVariable::BiasWeightAffineTransformVariable(
00055     const VarArray& the_varray,
00056     bool the_transpose_weights)
00057     : inherited(the_varray, 
00058                 (the_varray[0]->size() == 1) ? 
00059                 the_varray[2]->size() : 
00060                 (the_varray[0]->isRowVec() ? 1 : the_varray[2]->size()),
00061                 (the_varray[0]->size() == 1) ? 
00062                 1 : (the_varray[0]->isRowVec() ? the_varray[2]->size() : 1)),
00063       transpose_weights(the_transpose_weights)
00064 {
00065     build_();
00066 }
00067 
00068 void 
00069 BiasWeightAffineTransformVariable::makeDeepCopyFromShallowCopy(CopiesMap& copies)
00070 {
00071     inherited::makeDeepCopyFromShallowCopy(copies);
00072     varDeepCopyField(vec, copies);
00073     varDeepCopyField(weights, copies);
00074     varDeepCopyField(bias, copies);
00075 }
00076 
00077 
00078 void
00079 BiasWeightAffineTransformVariable::build()
00080 {
00081     inherited::build();
00082     build_();
00083 }
00084 
00085 void
00086 BiasWeightAffineTransformVariable::build_()
00087 {
00088     if(varray.length() != 3)
00089         PLERROR("In BiasWeightAffineTransformVariable():build_(): needs an input"
00090                 " vector, a weight matrix and a bias vector");
00091 
00092     vec = varray[0];
00093     weights = varray[1];
00094     bias = varray[2];
00095 
00096     if (!vec->isVec())
00097         PLERROR("In BiasWeightAffineTransformVariable: expecting a vector Var"
00098             " for the input vector");
00099     if(vec->size() != (!transpose_weights ? weights->length() : weights->width()))
00100         PLERROR("In BiasWeightAffineTransformVariable: weight matrix has"
00101                 " incompatible size");
00102 }
00103 
00104 void BiasWeightAffineTransformVariable::recomputeSize(int& l, int& w) const
00105 { 
00106     if (vec && weights) {
00107         l = (vec->isRowVec() && vec->size() != 1) ? 1 : bias->size();
00108         w = vec->isColumnVec() ? 1 : bias->size(); 
00109     } else
00110         l = w = 0;
00111 }
00112 
00113 
00114 void BiasWeightAffineTransformVariable::fprop()
00115 {
00116     value << bias->value;
00117 
00118     // Seems contradictive, but we are considering x.T versus x.T',
00119     // not T.x versus T'.x, for consistency with AffineTransformVariable!
00120     if(transpose_weights)
00121         productAcc(value, weights->matValue, vec->value);
00122     else
00123         transposeProductAcc(value, weights->matValue, vec->value);
00124 }
00125 
00126 
00127 void BiasWeightAffineTransformVariable::bprop()
00128 {    
00129     bias->gradient += gradient;    
00130     if(!vec->dont_bprop_here)
00131     {
00132         if(transpose_weights)
00133             transposeProductAcc(vec->gradient, weights->matValue, gradient);
00134         else
00135             productAcc(vec->gradient, weights->matValue, gradient);
00136     }
00137 
00138     if(transpose_weights)
00139         externalProductAcc(weights->matGradient, gradient, vec->value);
00140     else
00141         externalProductAcc(weights->matGradient, vec->value, gradient);
00142 }
00143 
00144 
00145 void BiasWeightAffineTransformVariable::symbolicBprop()
00146 {
00147     PLERROR("BiasWeightAffineTransformVariable::symbolicBprop() not implemented");
00148 }
00149 
00150 } // end of namespace PLearn
00151 
00152 
00153 /*
00154   Local Variables:
00155   mode:c++
00156   c-basic-offset:4
00157   c-file-style:"stroustrup"
00158   c-file-offsets:((innamespace . 0)(inline-open . 0))
00159   indent-tabs-mode:nil
00160   fill-column:79
00161   End:
00162 */
00163 // 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