PLearn 0.1
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Types | Private Member Functions
PLearn::RandomSamplesVMatrix Class Reference

The first sentence should be a BRIEF DESCRIPTION of what the class does. More...

#include <RandomSamplesVMatrix.h>

Inheritance diagram for PLearn::RandomSamplesVMatrix:
Inheritance graph
[legend]
Collaboration diagram for PLearn::RandomSamplesVMatrix:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 RandomSamplesVMatrix ()
 ### declare public option fields (such as build options) here Start your comments with Doxygen-compatible comments such as //!
virtual string classname () const
virtual OptionListgetOptionList () const
virtual OptionMapgetOptionMap () const
virtual RemoteMethodMapgetRemoteMethodMap () const
virtual RandomSamplesVMatrixdeepCopy (CopiesMap &copies) const
virtual void build ()
 Simply calls inherited::build() then build_().
virtual void makeDeepCopyFromShallowCopy (CopiesMap &copies)
 Transforms a shallow copy into a deep copy.

Static Public Member Functions

static string _classname_ ()
 Declares name and deepCopy methods.
static OptionList_getOptionList_ ()
static RemoteMethodMap_getRemoteMethodMap_ ()
static Object_new_instance_for_typemap_ ()
static bool _isa_ (const Object *o)
static void _static_initialize_ ()
static const PPathdeclaringFile ()

Public Attributes

bool alternate_targets
string is_preserved
int n_non_preserved
int32_t seed

Static Public Attributes

static StaticInitializer _static_initializer_

Protected Member Functions

virtual void getNewRow (int i, const Vec &v) const
 Fill the vector 'v' with the content of the i-th row.

Static Protected Member Functions

static void declareOptions (OptionList &ol)
 Declares the class options.

Protected Attributes

PP< PRandomrandom_gen
 Random number generator.
TVec< intnon_preserved
 List of examples in the source VMat that are not preserved.
TVec< intindices
 The i-th element is the index of the sample in the source VMat.
Vec last_targets
 The i-th element is the last target used for the i-th row in this VMat.
TVec< TVec< int > > target_list
 The i-th element is the list of all target indices, except i.
TVec< Vectarget_distr
 The i-th element is the distribution weights of all target indices, except i (i.e.
map< real, inttarget_to_idx
 Map a real-valued target to its index.
TVec< TVec< int > > by_target
 The i-th element is the list of all samples for the i-th target.

Private Types

typedef SourceVMatrix inherited

Private Member Functions

void build_ ()
 This does the actual building.

Detailed Description

The first sentence should be a BRIEF DESCRIPTION of what the class does.

Place the rest of the class programmer documentation here. Doxygen supports Javadoc-style comments. See http://www.doxygen.org/manual.html

Todo:
Write class to-do's here if there are any.
Deprecated:
Write deprecated stuff here if there is any. Indicate what else should be used instead.

Definition at line 58 of file RandomSamplesVMatrix.h.


Member Typedef Documentation

Reimplemented from PLearn::SourceVMatrix.

Definition at line 60 of file RandomSamplesVMatrix.h.


Constructor & Destructor Documentation

PLearn::RandomSamplesVMatrix::RandomSamplesVMatrix ( )

### declare public option fields (such as build options) here Start your comments with Doxygen-compatible comments such as //!

Default constructor

Definition at line 67 of file RandomSamplesVMatrix.cc.

                                          :
    alternate_targets(false),
    is_preserved("0"),
    n_non_preserved(-1),
    seed(1827),
    random_gen(new PRandom())
{
}

Member Function Documentation

string PLearn::RandomSamplesVMatrix::_classname_ ( ) [static]

Declares name and deepCopy methods.

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

OptionList & PLearn::RandomSamplesVMatrix::_getOptionList_ ( ) [static]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

RemoteMethodMap & PLearn::RandomSamplesVMatrix::_getRemoteMethodMap_ ( ) [static]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

bool PLearn::RandomSamplesVMatrix::_isa_ ( const Object o) [static]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

Object * PLearn::RandomSamplesVMatrix::_new_instance_for_typemap_ ( ) [static]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

StaticInitializer RandomSamplesVMatrix::_static_initializer_ & PLearn::RandomSamplesVMatrix::_static_initialize_ ( ) [static]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

void PLearn::RandomSamplesVMatrix::build ( ) [virtual]

Simply calls inherited::build() then build_().

Reimplemented from PLearn::SourceVMatrix.

Definition at line 123 of file RandomSamplesVMatrix.cc.

References PLearn::SourceVMatrix::build(), and build_().

Here is the call graph for this function:

void PLearn::RandomSamplesVMatrix::build_ ( ) [private]

This does the actual building.

Reimplemented from PLearn::SourceVMatrix.

Definition at line 132 of file RandomSamplesVMatrix.cc.

References alternate_targets, PLearn::TVec< T >::append(), by_target, PLearn::VMatLanguage::compileString(), PLearn::fast_exact_is_equal(), PLearn::VMat::getExample(), i, indices, is_preserved, PLearn::TVec< T >::isEmpty(), j, last_targets, PLearn::VMatrix::length(), PLearn::TVec< T >::length(), PLearn::VMat::length(), PLearn::VMatrix::length_, n, n_non_preserved, non_preserved, PLASSERT, PLERROR, random_gen, PLearn::TVec< T >::resize(), PLearn::VMatLanguage::run(), seed, PLearn::SourceVMatrix::setMetaInfoFromSource(), PLearn::VMatLanguage::setSource(), PLearn::SourceVMatrix::source, target_distr, target_list, target_to_idx, and PLearn::VMat::width().

Referenced by build().

{
    if (!source)
        return;

    random_gen->manual_seed(seed);

    // Initialize VPL program.
    VMatLanguage program;
    TVec<string> fieldnames;
    program.setSource(source);
    program.compileString(is_preserved, fieldnames);

    // Find out which samples need to be kept.
    int n = source->length();
    Vec row(source->width());
    Vec result(1);
    non_preserved.resize(0);
    indices.resize(0);
    for (int i = 0; i < n; i++) {
        program.run(i, result);
        if (fast_exact_is_equal(result[0], 1))
            // Sample i is to be preserved.
            indices.append(i);
        else
            non_preserved.append(i);
    }

    // Find out length of this VMat if the 'n_non_preserved' option is set.
    PLASSERT( n_non_preserved >= 0 || n_non_preserved == -1 ||
            n_non_preserved == -2 );
    if (n_non_preserved >= 0)
        length_ = indices.length() + n_non_preserved;
    else if (n_non_preserved == -2)
        length_ = indices.length() * 2;
    else if (length_ < 0)
        length_ = source->length();

    // Specific pre-processing for the case where 'alternate_targets' is true.
    if (alternate_targets) {
        // Currently this feature is not implemented when we preserve examples
        // (just because it is a bit more complex).
        if (!indices.isEmpty())
            PLERROR("In RandomSamplesVMatrix::build_ - The 'alternate_targets'"
                    " option is not implemented yet in the case where some "
                    "examples are preserved. Please implement it!");
        if (source->targetsize() != 1)
            PLERROR("In RandomSamplesVMatrix::build_ - The source must have "
                    "a targetsize of 1 in order to use the "
                    "'alternate_targets' option");
        // First we need to find the number of targets.
        map<real, TVec<int> > by_target_map; // Map a target to its samples.
        Vec input, target;
        real weight;
        target_to_idx.clear();
        for (int i = 0; i < source->length(); i++) {
            source->getExample(i, input, target, weight);
            by_target_map[target[0]].append(i);
            if (target_to_idx.count(target[0]) == 0) {
                int n_cur = target_to_idx.size();
                target_to_idx[target[0]] = n_cur;
            }
        }
        int n_targets = by_target_map.size();
        // Convert from map to vector (for convenience).
        by_target.resize(n_targets);
        map<real, TVec<int> >::const_iterator it = by_target_map.begin();
        for (int i = 0; i < n_targets; i++, it++)
            by_target[i] = it->second;
        // Build a map from a target index to all other target indices that may
        // be used afterwards, with corresponding probabilities.
        target_list.resize(n_targets);
        target_distr.resize(n_targets);
        for (int i = 0; i < n_targets; i++) {
            TVec<int>& tl = target_list[i];
            tl.resize(0);
            Vec& td = target_distr[i];
            td.resize(0);
            int n_others = 0;
           
            for (int j = 0; j < n_targets; j++)
                if (j != i) {
                    tl.append(j); // This is the list of all targets,
                                  // excluding 'i'.
                    td.append(by_target[j].length());
                    n_others += by_target[j].length();
                }
            td /= real(n_others); // Normalize probabilities.
        }

        // Resize 'last_targets'.
        last_targets.resize(source->length());
    }

    // Fill in 'indices' with as many -1 as necessary.
    if (indices.length() > length_)
        PLERROR("In RandomSamplesVMatrix::build_ - The number of preserved"
                "samples (%d) is higher than the length of this VMat (%d)",
                indices.length(), length_);
    while (indices.length() != length_)
        indices.append(-1);

    // Shuffle the list of indices.
    random_gen->shuffleElements(indices);

    setMetaInfoFromSource();
}

Here is the call graph for this function:

Here is the caller graph for this function:

string PLearn::RandomSamplesVMatrix::classname ( ) const [virtual]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

void PLearn::RandomSamplesVMatrix::declareOptions ( OptionList ol) [static, protected]

Declares the class options.

Reimplemented from PLearn::SourceVMatrix.

Definition at line 79 of file RandomSamplesVMatrix.cc.

References alternate_targets, PLearn::OptionBase::buildoption, PLearn::declareOption(), PLearn::SourceVMatrix::declareOptions(), is_preserved, n_non_preserved, and seed.

{
    // ### Declare all of this object's options here.
    // ### For the "flags" of each option, you should typically specify
    // ### one of OptionBase::buildoption, OptionBase::learntoption or
    // ### OptionBase::tuningoption. If you don't provide one of these three,
    // ### this option will be ignored when loading values from a script.
    // ### You can also combine flags, for example with OptionBase::nosave:
    // ### (OptionBase::buildoption | OptionBase::nosave)

    declareOption(ol, "is_preserved", &RandomSamplesVMatrix::is_preserved,
                                      OptionBase::buildoption,
        "VPL program that indicates if a sample is preserved.");

    declareOption(ol, "n_non_preserved",
                  &RandomSamplesVMatrix::n_non_preserved,
                  OptionBase::buildoption,
        "If given a non-negative value, it indicates the total number of\n"
        "non-preserved examples that are added to this VMat, and overrides\n"
        "the 'length' option. Two special negative values can be used:\n"
        " -1: this option is ignored, and the number of non-preserved\n"
        "     samples is set so that this VMat has either the desired length\n"
        "     (if the 'length' option is provided), or the same length as\n"
        "     its source otherwise.\n"
        " -2: the number of non-preserved examples is set exactly to match\n"
        "     the number of preserved examples.");

    declareOption(ol, "alternate_targets",
                  &RandomSamplesVMatrix::alternate_targets,
                  OptionBase::buildoption,
        "If set to 1, then this VMat will never sample two consecutive rows\n"
        "having the same target.");

    declareOption(ol, "seed", &RandomSamplesVMatrix::seed,
                              OptionBase::buildoption,
        "Seed for random number generation.");

    // Now call the parent class' declareOptions
    inherited::declareOptions(ol);
}

Here is the call graph for this function:

static const PPath& PLearn::RandomSamplesVMatrix::declaringFile ( ) [inline, static]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 87 of file RandomSamplesVMatrix.h.

:

RandomSamplesVMatrix * PLearn::RandomSamplesVMatrix::deepCopy ( CopiesMap copies) const [virtual]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

void PLearn::RandomSamplesVMatrix::getNewRow ( int  i,
const Vec v 
) const [protected, virtual]

Fill the vector 'v' with the content of the i-th row.

v is assumed to be the right size. ### This function must be overridden in your class

Reimplemented from PLearn::SourceVMatrix.

Definition at line 243 of file RandomSamplesVMatrix.cc.

References alternate_targets, by_target, i, indices, last_targets, PLearn::TVec< T >::length(), PLearn::VMat::length(), non_preserved, PLASSERT, random_gen, PLearn::SourceVMatrix::source, target_distr, target_list, and target_to_idx.

{
    if (indices[i] >= 0)
        source->getRow(indices[i], v);
    else {
        int random_sample;
        if (alternate_targets && i > 0) {
            // Note that the first sample may be any class since it has no
            // previous sample in this VMat.
            real previous_target = last_targets[i - 1];
            int previous_target_idx = target_to_idx[previous_target];
            int random_target = random_gen->multinomial_sample(
                    target_distr[previous_target_idx]);
            const TVec<int>& candidates =
                by_target[target_list[previous_target_idx][random_target]];
            int random_sample_idx = random_gen->uniform_multinomial_sample(
                    candidates.length());
            random_sample = candidates[random_sample_idx];
            PLASSERT( non_preserved.length() == source->length() );
        } else {
            random_sample =
                random_gen->uniform_multinomial_sample(non_preserved.length());
        }
        source->getRow(non_preserved[random_sample], v);
        if (alternate_targets)
            last_targets[i] = v[source->inputsize()];
    }
}

Here is the call graph for this function:

OptionList & PLearn::RandomSamplesVMatrix::getOptionList ( ) const [virtual]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

OptionMap & PLearn::RandomSamplesVMatrix::getOptionMap ( ) const [virtual]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

RemoteMethodMap & PLearn::RandomSamplesVMatrix::getRemoteMethodMap ( ) const [virtual]

Reimplemented from PLearn::SourceVMatrix.

Definition at line 62 of file RandomSamplesVMatrix.cc.

void PLearn::RandomSamplesVMatrix::makeDeepCopyFromShallowCopy ( CopiesMap copies) [virtual]

Transforms a shallow copy into a deep copy.

Reimplemented from PLearn::SourceVMatrix.

Definition at line 275 of file RandomSamplesVMatrix.cc.

References by_target, PLearn::deepCopyField(), indices, last_targets, PLearn::SourceVMatrix::makeDeepCopyFromShallowCopy(), non_preserved, random_gen, target_distr, and target_list.

Here is the call graph for this function:


Member Data Documentation

Reimplemented from PLearn::SourceVMatrix.

Definition at line 87 of file RandomSamplesVMatrix.h.

Definition at line 65 of file RandomSamplesVMatrix.h.

Referenced by build_(), declareOptions(), and getNewRow().

The i-th element is the list of all samples for the i-th target.

Definition at line 124 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

The i-th element is the index of the sample in the source VMat.

If it is -1, this means it is a non-preserved sample, and thus should be randomly sampled from the 'non_preserved' list.

Definition at line 107 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

Definition at line 66 of file RandomSamplesVMatrix.h.

Referenced by build_(), and declareOptions().

The i-th element is the last target used for the i-th row in this VMat.

Definition at line 110 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

Definition at line 67 of file RandomSamplesVMatrix.h.

Referenced by build_(), and declareOptions().

List of examples in the source VMat that are not preserved.

Definition at line 102 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

Random number generator.

Definition at line 99 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

Definition at line 68 of file RandomSamplesVMatrix.h.

Referenced by build_(), and declareOptions().

The i-th element is the distribution weights of all target indices, except i (i.e.

the distribution to sample from after an example of the i-th target).

Definition at line 118 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

The i-th element is the list of all target indices, except i.

Definition at line 113 of file RandomSamplesVMatrix.h.

Referenced by build_(), getNewRow(), and makeDeepCopyFromShallowCopy().

Map a real-valued target to its index.

Definition at line 121 of file RandomSamplesVMatrix.h.

Referenced by build_(), and getNewRow().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines