PLearn 0.1
LiftOutputVariable.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // PLearn (A C++ Machine Learning Library)
00004 // Copyright (C) 2003 Olivier Delalleau
00005 
00006 // Redistribution and use in source and binary forms, with or without
00007 // modification, are permitted provided that the following conditions are met:
00008 // 
00009 //  1. Redistributions of source code must retain the above copyright
00010 //     notice, this list of conditions and the following disclaimer.
00011 // 
00012 //  2. Redistributions in binary form must reproduce the above copyright
00013 //     notice, this list of conditions and the following disclaimer in the
00014 //     documentation and/or other materials provided with the distribution.
00015 // 
00016 //  3. The name of the authors may not be used to endorse or promote
00017 //     products derived from this software without specific prior written
00018 //     permission.
00019 // 
00020 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
00021 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00022 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
00023 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00024 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00025 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00026 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00027 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00028 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00029 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030 // 
00031 // This file is part of the PLearn library. For more information on the PLearn
00032 // library, go to the PLearn Web site at www.plearn.org
00033 
00034 
00035 /* *******************************************************      
00036  * $Id: LiftOutputVariable.cc 6351 2006-10-25 19:05:45Z chapados $
00037  * This file is part of the PLearn library.
00038  ******************************************************* */
00039 
00040 #include "LiftOutputVariable.h"
00041 
00042 namespace PLearn {
00043 using namespace std;
00044 
00047 PLEARN_IMPLEMENT_OBJECT(
00048     LiftOutputVariable,
00049     "The result is the output if the target is 1, and the opposite of the output "
00050     "otherwise. This variable is to be used with a LiftStatsCollector, in a"
00051     "stochastic gradient descent.",
00052     "NO HELP"
00053     );
00054 
00056 // LiftOutputVariable //
00058 LiftOutputVariable::LiftOutputVariable(Variable* netout, Variable* target)
00059     : inherited(netout,target,netout->length(),netout->width())
00060 {
00061     build_();
00062 }
00063 
00064 void
00065 LiftOutputVariable::build()
00066 {
00067     inherited::build();
00068     build_();
00069 }
00070 
00071 void
00072 LiftOutputVariable::build_()
00073 {
00074     if (input1 && input2) {
00075         // input1 and input2 are (respectively) netout and target from the constructor
00076         if(input1->size() != input2->size())
00077             PLERROR("In LiftOutputVariable: netout and target must have the same size");
00078     }
00079 }
00080 
00082 // recomputeSize //
00084 void LiftOutputVariable::recomputeSize(int& l, int& w) const
00085 { 
00086     //l=1, w=1;
00087     if(input1)
00088     {
00089         l=input1->length(); 
00090         w=input1->width(); 
00091     }
00092 }
00093 
00095 // fprop //
00097 void LiftOutputVariable::fprop()
00098 {
00099     for(int i=0;i<size(); i++)
00100     {
00101         real output = input1->valuedata[i];
00102         real target = input2->valuedata[i];
00103         if(!is_missing(target))
00104         {
00105             PLASSERT(fast_exact_is_equal(target, 0) || fast_exact_is_equal(target, 1.0));
00106             if (fast_exact_is_equal(target, 1.0)) {
00107                 if (fast_exact_is_equal(output, 0.0)) {
00108                     // We need to make sure the output is positive.
00109                     output = 1e-10;
00110                 }
00111                 valuedata[i] = output;
00112             } else {
00113                 valuedata[i] = -output;
00114             }
00115         }
00116         else
00117             valuedata[i] = MISSING_VALUE;
00118     }
00119 }
00120 
00121 void LiftOutputVariable::bprop()
00122 {
00123     // TODO Not really sure what to do here, bprop shouldn't be used anyway.
00124     // Actually it IS called, should investigate why and what it does.
00125     // PLWARNING("In LiftOutputVariable::bprop - You should not backprop on a LiftOutputVariable");
00126     real gr = *gradientdata;
00127     for (int i=0; i<input1->size(); i++)
00128     {
00129         input1->gradientdata[i] += gr;
00130     }
00131 }
00132 
00133 } // end of namespace PLearn
00134 
00135 
00136 /*
00137   Local Variables:
00138   mode:c++
00139   c-basic-offset:4
00140   c-file-style:"stroustrup"
00141   c-file-offsets:((innamespace . 0)(inline-open . 0))
00142   indent-tabs-mode:nil
00143   fill-column:79
00144   End:
00145 */
00146 // 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