PLearn 0.1
MultiSampleVariable.cc
Go to the documentation of this file.
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 :
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines