PLearn 0.1
|
00001 // -*- C++ -*- 00002 00003 // MultiSampleVariable.cc 00004 // 00005 // Copyright (C) 2007 Simon Lemieux, Pascal Vincent 00006 // 00007 // Redistribution and use in source and binary forms, with or without 00008 // modification, are permitted provided that the following conditions are met: 00009 // 00010 // 1. Redistributions of source code must retain the above copyright 00011 // notice, this list of conditions and the following disclaimer. 00012 // 00013 // 2. Redistributions in binary form must reproduce the above copyright 00014 // notice, this list of conditions and the following disclaimer in the 00015 // documentation and/or other materials provided with the distribution. 00016 // 00017 // 3. The name of the authors may not be used to endorse or promote 00018 // products derived from this software without specific prior written 00019 // permission. 00020 // 00021 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00022 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00023 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00024 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00025 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00026 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 // 00032 // This file is part of the PLearn library. For more information on the PLearn 00033 // library, go to the PLearn Web site at www.plearn.org 00034 00035 // Authors: Simon Lemieux, Pascal Vincent 00036 00040 #include "MultiSampleVariable.h" 00041 00042 namespace PLearn { 00043 using namespace std; 00044 00047 PLEARN_IMPLEMENT_OBJECT( 00048 MultiSampleVariable, 00049 "Different max variables done on separate groups of the input", 00050 "This variables samples" 00051 "\non subvectors of the input, which lengths are defined by the field groupsize" 00052 "\n" 00053 ); 00054 00055 00057 00058 MultiSampleVariable::MultiSampleVariable(Variable* input, int groupsize) 00059 : inherited(input, input->length(), input->width()), 00060 groupsize(groupsize), 00061 random_gen(NULL) 00062 { 00063 build_(); 00064 } 00065 00066 void MultiSampleVariable::recomputeSize(int& l, int& w) const 00067 { 00068 if (input) { 00069 l = input->length(); 00070 w = input->width() ; 00071 } else 00072 l = w = 0; 00073 } 00074 00075 // ### computes value from input's value 00076 void MultiSampleVariable::fprop() 00077 { 00078 if(random_gen.isNull()) 00079 random_gen = PRandom::common(false); 00080 00081 int k; 00082 Mat inputValue = input->matValue; 00083 00084 Vec inputValue_n; 00085 Vec value_n; 00086 00087 for(int n=0; n<inputValue.length(); n++) 00088 { 00089 k=0; 00090 inputValue_n = inputValue(n); 00091 value_n = matValue(n); 00092 00093 //we set all values to 0. before sampling "ones" 00094 for (int i=0; i<value_n.length(); i++) 00095 value_n[i]=0.; 00096 00097 while ( k < this->width() ) 00098 { 00099 sample_range(inputValue_n, value_n, k, groupsize); 00100 k+=groupsize; 00101 } 00102 } 00103 } 00104 00105 // ### computes input's gradient from gradient 00106 void MultiSampleVariable::bprop() 00107 {} 00108 // ### You can implement these methods: 00109 // void MultiSampleVariable::bbprop() {} 00110 // void MultiSampleVariable::symbolicBprop() {} 00111 // void MultiSampleVariable::rfprop() {} 00112 00113 00114 // ### Nothing to add here, simply calls build_ 00115 void MultiSampleVariable::build() 00116 { 00117 inherited::build(); 00118 build_(); 00119 } 00120 00121 void MultiSampleVariable::makeDeepCopyFromShallowCopy(CopiesMap& copies) 00122 { 00123 inherited::makeDeepCopyFromShallowCopy(copies); 00124 00125 // ### Call deepCopyField on all "pointer-like" fields 00126 // ### that you wish to be deepCopied rather than 00127 // ### shallow-copied. 00128 // ### ex: 00129 //deepCopyField(groupsizes, copies); 00130 // ### If you want to deepCopy a Var field: 00131 // varDeepCopyField(somevariable, copies); 00132 } 00133 00134 void MultiSampleVariable::declareOptions(OptionList& ol) 00135 { 00136 // ### Declare all of this object's options here. 00137 // ### For the "flags" of each option, you should typically specify 00138 // ### one of OptionBase::buildoption, OptionBase::learntoption or 00139 // ### OptionBase::tuningoption. If you don't provide one of these three, 00140 // ### this option will be ignored when loading values from a script. 00141 // ### You can also combine flags, for example with OptionBase::nosave: 00142 // ### (OptionBase::buildoption | OptionBase::nosave) 00143 00144 // ### ex: 00145 //declareOption(ol, "groupsizes", &MultiSampleVariable::groupsizes, 00146 // OptionBase::buildoption, 00147 // "this tells how to \"divide\" our diffrents inputs\nex: groupsizes = [1,2,3] says we divide our output like this :\n[x1],[x2,x3],[x4,x5,x6] and apply a maximum algorithm on each group separately"); 00148 00149 declareOption(ol, "groupsize", &MultiSampleVariable::groupsize, 00150 OptionBase::buildoption, 00151 "shortcut if you want all groupsizes to be equals, for example if you set the value of this option to be 3, it will make groupsizes = [3,3,...,3]"); 00152 00153 declareOption(ol, "random_gen", &MultiSampleVariable::random_gen, 00154 OptionBase::buildoption, 00155 "Random number generator. If null, the PRandom::common(false) generator will be used."); 00156 00157 // Now call the parent class' declareOptions 00158 inherited::declareOptions(ol); 00159 } 00160 00161 void MultiSampleVariable::build_() 00162 { 00163 // ### This method should do the real building of the object, 00164 // ### according to set 'options', in *any* situation. 00165 // ### Typical situations include: 00166 // ### - Initial building of an object from a few user-specified options 00167 // ### - Building of a "reloaded" object: i.e. from the complete set of 00168 // ### all serialised options. 00169 // ### - Updating or "re-building" of an object after a few "tuning" 00170 // ### options have been modified. 00171 // ### You should assume that the parent class' build_() has already been 00172 // ### called. 00173 00174 if (groupsize <= 0) 00175 PLERROR("Groupsize(s) not specified or invalid in MultiSampleVariable"); 00176 if (input->width() % groupsize != 0) 00177 PLERROR("Invalid groupsize in MultiSampleVariable (%i does not divide %i)", groupsize, input->width()); 00178 } 00179 00180 00182 // some utils // 00184 00185 void MultiSampleVariable::sample_range(Vec &x, Vec &y, int start, int length) 00186 { 00187 if(length != 1) 00188 { 00189 y[start+random_gen->multinomial_sample(x.subVec(start,length))] = 1; 00190 } 00191 else // if groupsize == 1 00192 { 00193 Vec temp(2); 00194 temp[0] = 1.-x[start]; 00195 temp[1] = temp[0]; 00196 y[start] = random_gen->multinomial_sample(temp); 00197 } 00198 } 00199 00200 00201 00202 00203 00204 } // end of namespace PLearn 00205 00206 00207 /* 00208 Local Variables: 00209 mode:c++ 00210 c-basic-offset:4 00211 c-file-style:"stroustrup" 00212 c-file-offsets:((innamespace . 0)(inline-open . 0)) 00213 indent-tabs-mode:nil 00214 fill-column:79 00215 End: 00216 */ 00217 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :