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,v 1.6 2004/04/27 15:58:16 morinf Exp $ 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,1,1) 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 { l=1, w=1; } 00086 00088 // fprop // 00090 void LiftOutputVariable::fprop() 00091 { 00092 real output = input1->valuedata[0]; 00093 real target = input2->valuedata[0]; 00094 if (target == 1.0) { 00095 if (output == 0.0) { 00096 // We need to make sure the output is positive. 00097 output = 1e-10; 00098 } 00099 valuedata[0] = output; 00100 } else { 00101 valuedata[0] = -output; 00102 } 00103 } 00104 00105 void LiftOutputVariable::bprop() 00106 { 00107 // TODO Not really sure what to do here, bprop shouldn't be used anyway. 00108 // Actually it IS called, should investigate why and what it does. 00109 // PLWARNING("In LiftOutputVariable::bprop - You should not backprop on a LiftOutputVariable"); 00110 real gr = *gradientdata; 00111 for (int i=0; i<input1->size(); i++) 00112 { 00113 input1->gradientdata[i] += gr; 00114 } 00115 } 00116 00117 } // end of namespace PLearn