Skip to content

Commit

Permalink
remove .subset functionality from VectorVisitor and DataFrameVisitors…
Browse files Browse the repository at this point in the history
…. This now fully belongs to the lighter SubsetVectorVisitor and DataFrameSubsetVisitors classes. should help tidyverse#1299
  • Loading branch information
romainfrancois committed Aug 5, 2015
1 parent a161424 commit 487c750
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 403 deletions.
54 changes: 17 additions & 37 deletions inst/include/dplyr/DataFrameColumnVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,64 +6,44 @@ namespace dplyr {
class DataFrameColumnVisitor : public VectorVisitor {
public:
DataFrameColumnVisitor( const DataFrame& data_ ) : data(data_), visitors(data) {}

inline size_t hash(int i) const {
return visitors.hash(i) ;
return visitors.hash(i) ;
}

inline bool equal(int i, int j) const {
return visitors.equal(i,j) ;
return visitors.equal(i,j) ;
}

inline bool less( int i, int j ) const {
return visitors.less(i,j) ;
return visitors.less(i,j) ;
}

inline bool greater( int i, int j ) const {
return visitors.greater(i,j) ;
}

inline SEXP subset( const Rcpp::IntegerVector& index ) const {
return visitors.subset( index, data.attr("class") ) ;
}

inline SEXP subset( const std::vector<int>& index ) const {
return visitors.subset( index, data.attr("class") ) ;
}

inline SEXP subset( const ChunkIndexMap& index ) const {
return visitors.subset( index, data.attr("class") ) ;
}

inline SEXP subset( const Rcpp::LogicalVector& index ) const {
return visitors.subset( index, data.attr("class") ) ;
return visitors.greater(i,j) ;
}

inline SEXP subset( EmptySubset index ) const {
return visitors.subset( index, data.attr("class") );
}


virtual int size() const {
return visitors.nrows() ;
return visitors.nrows() ;
}

virtual std::string get_r_type() const {
return "data.frame" ;
return "data.frame" ;
}

virtual bool is_compatible( VectorVisitor* other, std::stringstream&, const std::string& ) const {
return true ;
}

bool is_na( int i ) const {
return false ;
return false ;
}

private:
DataFrame data ;
DataFrameVisitors visitors ;
} ;

}

#endif
32 changes: 1 addition & 31 deletions inst/include/dplyr/DataFrameVisitors.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,36 +56,6 @@ namespace dplyr {

}

template <typename Container>
DataFrame subset_impl( const Container& index, const CharacterVector& classes, traits::false_type ) const {
List out(nvisitors);
for( int k=0; k<nvisitors; k++){
out[k] = get(k)->subset(index) ;
}
structure( out, Rf_length(out[0]) , classes) ;
return out ;
}

template <typename Container>
DataFrame subset_impl( const Container& index, const CharacterVector& classes, traits::true_type ) const {
int n = index.size() ;
int n_out = std::count( index.begin(), index.end(), TRUE ) ;
IntegerVector idx = no_init(n_out) ;
for(int i=0, k=0; i<n; i++){
if( index[i] == TRUE ){
idx[k++] = i ;
}
}
return subset_impl( idx, classes, traits::false_type() ) ;
}

template <typename Container>
inline DataFrame subset( const Container& index, const CharacterVector& classes ) const {
return subset_impl( index, classes,
typename traits::same_type<Container, LogicalVector>::type()
) ;
}

inline int size() const { return nvisitors ; }
inline VectorVisitor* get(int k) const { return visitors[k] ; }

Expand All @@ -105,7 +75,7 @@ namespace dplyr {
}

} ;

} // namespace dplyr


Expand Down
128 changes: 36 additions & 92 deletions inst/include/dplyr/MatrixColumnVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,170 +2,114 @@
#define dplyr_MatrixColumnVisitor_H

namespace dplyr {

template <int RTYPE>
class MatrixColumnVisitor : public VectorVisitor {
public:
public:

typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
typedef typename Matrix<RTYPE>::Column Column ;

class ColumnVisitor : public comparisons<RTYPE> {
public:
typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
typedef comparisons<RTYPE> compare ;
typedef boost::hash<STORAGE> hasher ;
ColumnVisitor( Matrix<RTYPE>& data, int column ) :

ColumnVisitor( Matrix<RTYPE>& data, int column ) :
column( data.column(column) ) {}

inline size_t hash(int i) const {
return hash_fun( const_cast<Column&>(column)[i] ) ;
}

inline bool equal( int i, int j ) const {
return compare::equal_or_both_na( const_cast<Column&>(column)[i], const_cast<Column&>(column)[j] ) ;
return compare::equal_or_both_na( const_cast<Column&>(column)[i], const_cast<Column&>(column)[j] ) ;
}
inline bool less(int i, int j) const {

inline bool less(int i, int j) const {
return compare::is_less( const_cast<Column&>(column)[i], const_cast<Column&>(column)[j] ) ;
}

inline bool equal_or_both_na(int i, int j) const {
return compare::equal_or_both_na( const_cast<Column&>(column)[i], const_cast<Column&>(column)[j] ) ;
return compare::equal_or_both_na( const_cast<Column&>(column)[i], const_cast<Column&>(column)[j] ) ;
}
inline bool greater(int i, int j) const {

inline bool greater(int i, int j) const {
return compare::is_greater( const_cast<Column&>(column)[i], const_cast<Column&>(column)[j] ) ;
}

private:
Column column ;
hasher hash_fun ;
} ;

MatrixColumnVisitor( const Matrix<RTYPE>& data_ ) : data(data_), visitors() {
for( int h=0; h<data.ncol(); h++){
visitors.push_back( ColumnVisitor( data, h ) ) ;
visitors.push_back( ColumnVisitor( data, h ) ) ;
}
}

inline size_t hash(int i) const {
size_t seed = visitors[0].hash(i) ;
for( size_t h=1; h<visitors.size(); h++){
boost::hash_combine( seed, visitors[h].hash(i) ) ;
}
return seed ;
}

inline bool equal(int i, int j) const {
if( i == j ) return true ;
for( size_t h=0; h<visitors.size(); h++){
if( !visitors[h].equal(i,j) ) return false ;
if( !visitors[h].equal(i,j) ) return false ;
}
return true ;
}

inline bool less( int i, int j ) const {
if( i == j ) return false ;
for( size_t h=0; h<visitors.size(); h++){
const ColumnVisitor& v = visitors[h] ;
if( !v.equal(i,j) ){
return v.less(i,j) ;
return v.less(i,j) ;
}
}
return i < j ;
}

inline bool greater( int i, int j ) const {
if( i == j ) return false ;
for( size_t h=0; h<visitors.size(); h++){
const ColumnVisitor& v = visitors[h] ;
if( !v.equal(i,j) ){
return v.greater(i,j) ;
}
}
return i < j ;
}

inline SEXP subset( const Rcpp::IntegerVector& index ) const {
return subset_int( index ) ;
}

inline SEXP subset( const std::vector<int>& index ) const {
return subset_int( index ) ;
}

inline SEXP subset( const ChunkIndexMap& index ) const {
int n = index.size() ;
Matrix<RTYPE> res( n, data.ncol() ) ;
for( size_t h=0; h<visitors.size(); h++){
ChunkIndexMap::const_iterator it = index.begin();
Column column = res.column(h) ;
Column source_column = const_cast<Matrix<RTYPE>&>(data).column(h) ;

for( int i=0; i<n; i++, ++it){
column[i] = source_column[ it->first ] ;
return v.greater(i,j) ;
}
}
return res ;
}

inline SEXP subset( const Rcpp::LogicalVector& index ) const {
int n = output_size(index) ;
Matrix<RTYPE> res(n, data.ncol()) ;
for( size_t h=0; h<visitors.size(); h++){
Column column = res.column(h) ;
Column source_column = const_cast<Matrix<RTYPE>&>(data).column(h) ;

for( int i=0, k=0; k<n; k++, i++ ) {
while( index[i] != TRUE ) i++;
column[k] = source_column[i] ;
}
}
return res ;
}

inline SEXP subset( EmptySubset index ) const {
return Matrix<RTYPE>( 0, data.ncol() );
return i < j ;
}

inline int size() const {
return data.nrow() ;
return data.nrow() ;
}

inline std::string get_r_type() const {
return "matrix" ;
return "matrix" ;
}

inline bool is_compatible( VectorVisitor* other, std::stringstream&, const std::string& ) const {
return true ;
}

bool is_na( int i ) const {
return false ;
return false ;
}

private:

template <typename Container>
inline SEXP subset_int( const Container& index ) const {
int n = index.size() ;
Matrix<RTYPE> res( n, data.ncol() ) ;
for( size_t h=0; h<visitors.size() ; h++){
Column column = res.column(h) ;
Column source_column = const_cast<Matrix<RTYPE>&>(data).column(h) ;
for(int k=0; k< n; k++){
column[k] = source_column[ index[k] ] ;
}
}
return res ;
}


Matrix<RTYPE> data ;
std::vector<ColumnVisitor> visitors ;
} ;

}

#endif
Loading

0 comments on commit 487c750

Please sign in to comment.