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

Sort the samples of a VMatrix according to one (or more) given columns. More...

#include <SortRowsVMatrix.h>

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

List of all members.

Public Member Functions

 SortRowsVMatrix ()
virtual string classname () const
virtual OptionListgetOptionList () const
virtual OptionMapgetOptionMap () const
virtual RemoteMethodMapgetRemoteMethodMap () const
virtual SortRowsVMatrixdeepCopy (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_ ()
 SortRowsVMatrix.
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 ignore_missing_fields
 Public build options.
bool increasing_order
TVec< intsort_columns
TVec< string > sort_columns_by_name

Static Public Attributes

static StaticInitializer _static_initializer_

Static Protected Member Functions

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

Private Types

typedef SelectRowsVMatrix inherited

Private Member Functions

void build_ ()
 This does the actual building.

Static Private Member Functions

static void sortRows (VMat &m, TVec< int > &indices, TVec< int > &sort_columns, int istart, int iend, int colstart, bool increasing_order)
 This function returns in indices the sorting of the rows of a VMat m, according to the columns specified by sort_columns[colstart, ...], where m is viewed as ordered by the indices given at calling time.

Detailed Description

Sort the samples of a VMatrix according to one (or more) given columns.

Definition at line 52 of file SortRowsVMatrix.h.


Member Typedef Documentation

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 57 of file SortRowsVMatrix.h.


Constructor & Destructor Documentation

PLearn::SortRowsVMatrix::SortRowsVMatrix ( )

Member Function Documentation

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

SortRowsVMatrix.

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 116 of file SortRowsVMatrix.cc.

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

Here is the call graph for this function:

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

This does the actual building.

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 125 of file SortRowsVMatrix.cc.

References PLearn::TVec< T >::append(), PLearn::SelectRowsVMatrix::build(), PLearn::VMat::column(), PLearn::TMat< T >::column(), PLearn::VMat::getFieldIndex(), i, ignore_missing_fields, increasing_order, PLearn::SelectRowsVMatrix::indices, PLearn::SelectRowsVMatrix::indices_vmat, PLearn::TVec< T >::isNotEmpty(), j, PLearn::VMat::length(), PLearn::TVec< T >::length(), PLERROR, PLearn::TVec< T >::resize(), sort_columns, sort_columns_by_name, sortRows(), PLearn::SourceVMatrix::source, PLearn::VMat::subMatColumns(), PLearn::VMatrix::updateMtime(), and PLearn::VMat::width().

Referenced by build().

{
    if (sort_columns_by_name.isNotEmpty() && source) {
        // Convert column names into column indices.
        sort_columns.resize(0);
        for (int i = 0; i < sort_columns_by_name.length(); i++) {
            int idx = source->getFieldIndex(sort_columns_by_name[i],
                                            !ignore_missing_fields);
            if (idx >= 0)
                sort_columns.append(idx);
        }
    }
    // Check we don't try to sort twice by the same column (this can be confusing).
    // Also verify fields do exist, just in case.
    if (sort_columns.isNotEmpty()) {
        for (int i = 0; i < sort_columns.length(); i++) {
            if (!ignore_missing_fields &&
                    (sort_columns[i] < 0 || sort_columns[i] >= source->width()))
                PLERROR("In SortRowsVMatrix::build_ - Field with index %d "
                        "cannot exist in the source VMatrix, whose width is "
                        "%d", sort_columns[i], source->width());
            for (int j = i + 1; j < sort_columns.length(); j++) {
                if (sort_columns[j] == sort_columns[i]) {
                    PLERROR("In SortRowsVMatrix::build_ - You have a duplicated index in the 'sort_columns' vector");
                }
            }
        }
    }
    // Construct the indices vector.
    if (source) {
        updateMtime(source);
        indices = TVec<int>(0, source.length()-1, 1);
        if (sort_columns.length() > 1) {
            // We need to sort many columns: we use the unefficient method.
            sortRows(source, indices, sort_columns, 0, source->length()-1, 0, increasing_order);
        } else if (sort_columns.length() > 0) {
            // Only sorting one column: we can do this more efficiently.
            Mat to_sort(source->length(), 2);
            // Fill first column with the column to sort.
            to_sort.column(0) << source.subMatColumns(sort_columns[0], 1);
            // Fill 2nd column with indices.
            to_sort.column(1) << Vec(0, to_sort.length() - 1, 1);

            if (to_sort.column(0).hasMissing()) {
                // We have missing values, so we use the unefficient method
                sortRows(source, indices, sort_columns, 0, source->length()-1,
                         0, increasing_order);
            } else {
                // Perform the sort.
                PLearn::sortRows(to_sort, 0, increasing_order);
                // Get the indices.
                indices << to_sort.column(1);
            }
        }
        inherited::build(); // Since we have just changed the indices.
    }
    updateMtime(indices_vmat);
}

Here is the call graph for this function:

Here is the caller graph for this function:

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Declares this class' options.

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 70 of file SortRowsVMatrix.cc.

References PLearn::OptionBase::buildoption, PLearn::declareOption(), PLearn::SelectRowsVMatrix::declareOptions(), ignore_missing_fields, increasing_order, PLearn::SelectRowsVMatrix::indices, PLearn::SelectRowsVMatrix::indices_vmat, PLearn::OptionBase::nosave, PLearn::redeclareOption(), sort_columns, and sort_columns_by_name.

{
    declareOption(ol, "sort_columns", &SortRowsVMatrix::sort_columns,
                                      OptionBase::buildoption,
        "Indices of the column(s) that must be sorted (the first one is the\n"
        "first criterion).");

    declareOption(ol, "sort_columns_by_name",
                  &SortRowsVMatrix::sort_columns_by_name,
                  OptionBase::buildoption,
        "Names of the column(s) that must be sorted (the first one is the\n"
        "first criterion). This option is optional and, if provided, the\n"
        "'sort_columns' option will be ignored.");

    declareOption(ol, "ignore_missing_fields",
                  &SortRowsVMatrix::ignore_missing_fields,
                  OptionBase::buildoption,
        "If true, then no error will be thrown when a column given in\n"
        "sort_columns or sort_columns_by_name is missing.");

    declareOption(ol, "increasing_order", &SortRowsVMatrix::increasing_order, OptionBase::buildoption,
                  "    if set to 1, the data will be sorted in increasing order");

    inherited::declareOptions(ol);

    // Hide unused options.

    redeclareOption(ol, "indices", &SortRowsVMatrix::indices, OptionBase::nosave,
                    "The indices are computed at build time.");
    redeclareOption(ol, "indices_vmat", &SortRowsVMatrix::indices_vmat, OptionBase::nosave,
                    "Unused.");
}

Here is the call graph for this function:

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 71 of file SortRowsVMatrix.h.

:

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 55 of file SortRowsVMatrix.cc.

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

Transforms a shallow copy into a deep copy.

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 106 of file SortRowsVMatrix.cc.

References PLearn::deepCopyField(), PLearn::SelectRowsVMatrix::makeDeepCopyFromShallowCopy(), sort_columns, and sort_columns_by_name.

Here is the call graph for this function:

void PLearn::SortRowsVMatrix::sortRows ( VMat m,
TVec< int > &  indices,
TVec< int > &  sort_columns,
int  istart,
int  iend,
int  colstart,
bool  increasing_order 
) [static, private]

This function returns in indices the sorting of the rows of a VMat m, according to the columns specified by sort_columns[colstart, ...], where m is viewed as ordered by the indices given at calling time.

Only the samples between istart and iend are considered.

Definition at line 187 of file SortRowsVMatrix.cc.

References i, PLearn::is_equal(), PLearn::is_missing(), j, PLearn::TVec< T >::length(), m, and PLearn::TVec< T >::size().

Referenced by build_().

                                                                                                                                              {
    real best = 0; // Initialization only to prevent compiler warning.
    real jval;
    int tmp;
    bool better;
    if (sort_columns.size() > colstart) {
        int col = sort_columns[colstart]; // The current column used to perform sorting.
        for (int i = istart; i <= iend-1; i++) {
            // Let's look for the i-th element of our result.
            int i_nan = i;
            // Find first non-missing.
            while (i_nan <= iend && is_missing(best = m(indices[i_nan],col))) i_nan++;
            if (i_nan > iend)
                // All nan !
                break;
            else if (i_nan > i) {
                // There were some nans. We swap i_nan and i.
                tmp = indices[i];
                indices[i] = indices[i_nan];
                indices[i_nan] = tmp;
            }
            for (int j = i+1; j <= iend; j++) {
                better = false;
                jval = m(indices[j],col);
                if (increasing_order && jval < best)
                    better = true;
                else if (!increasing_order && jval > best)
                    better = true;
                if (better) {
                    // Swap i and j.
                    tmp = indices[j];
                    indices[j] = indices[i];
                    indices[i] = tmp;
                    best = jval;
                }
            }
        }
        // At this point, we have only sorted according to one column.
        if (sort_columns.length() > colstart + 1) {
            // There are other sorting criteria.
            // Let's find where we need to apply them.
            int i = istart;
            real val;
            while (i <= iend - 1) {
                val = m(indices[i],col);
                int j = i+1;
                while (   j <= iend
                          && ( is_equal(m(indices[j],col), val, 1.0)))
                    j++;
                j--;
                if (j > i) {
                    // There are consecutive elements with the same value for the sorting
                    // criterion, thus we must use the other criteria to sort them correctly.
                    sortRows(m, indices, sort_columns, i, j, colstart + 1, increasing_order);
                }
                i = j+1;
            }
        }
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Reimplemented from PLearn::SelectRowsVMatrix.

Definition at line 71 of file SortRowsVMatrix.h.

Public build options.

Definition at line 62 of file SortRowsVMatrix.h.

Referenced by build_(), and declareOptions().

Definition at line 63 of file SortRowsVMatrix.h.

Referenced by build_(), and declareOptions().

Definition at line 64 of file SortRowsVMatrix.h.

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

Definition at line 65 of file SortRowsVMatrix.h.

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


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