Skip to content

Commit fc986b1

Browse files
560 alp reference sort primitive (#113)
* started adding sequential implementation of sort + unit test * added vector iterators and internal begin/end * begin/end logic defined privately * Addressing first round of reviews * Started definition of internal base classes for ALP relations. * added first unit tests * adapted sort to use the ALP relations' proposed draft * Added missing basic relations and respective unit tests. * setting (strict) poset requirement for sort's relation * Addressing reviews. * Addressing additional reviews: style fix, added grb-like set< use_index >, use alp::sort in symm_tridiag_dac_eigensolver algorithm. * Code style fix * Added review note in comment. * Basing internal relation checks on internal ops apply (equal and not_equal only for now)
1 parent 7315f18 commit fc986b1

File tree

18 files changed

+2023
-37
lines changed

18 files changed

+2023
-37
lines changed

include/alp.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
// #include <alp/ops.hpp>
153153
// #include <alp/pinnedvector.hpp>
154154
// #include <alp/properties.hpp>
155+
#include <alp/rels.hpp>
155156
// #include <alp/semiring.hpp>
156157
// #include <alp/spmd.hpp>
157158

include/alp/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ set( root_files
4848
"ops.hpp"
4949
"phase.hpp"
5050
"rc.hpp"
51+
"rels.hpp"
5152
"scalar.hpp"
5253
"semiring.hpp"
5354
"storage.hpp"

include/alp/algorithms/symm_tridiag_eigensolver.hpp

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
// TEMPDISABLE should be removed in the final version
2727
#define TEMPDISABLE
2828

29+
2930
namespace alp {
3031

3132
namespace algorithms {
@@ -484,24 +485,12 @@ namespace alp {
484485
print_vector( " z ", z );
485486
#endif
486487

487-
// permutations which sort dtmp
488-
std::vector< size_t > isort_dtmp( n, 0 );
489-
std::vector< size_t > no_permute_data( n, 0 );
490-
for( size_t i = 0; i < n; ++i ) {
491-
isort_dtmp[ i ] = i;
492-
no_permute_data[ i ] = i;
493-
}
494-
std::sort(
495-
isort_dtmp.begin(),
496-
isort_dtmp.end(),
497-
[ &dtmp ]( const size_t &a, const size_t &b ) {
498-
return ( dtmp[ a ] < dtmp[ b ] );
499-
}
500-
);
488+
// permutation that sorts dtmp
501489
alp::Vector< size_t > permutation_vec( n );
490+
rc = rc ? rc : alp::sort( permutation_vec, dtmp, alp::relations::lt< D >() );
491+
502492
alp::Vector< size_t > no_permutation_vec( n );
503-
alp::buildVector( permutation_vec, isort_dtmp.begin(), isort_dtmp.end() );
504-
alp::buildVector( no_permutation_vec, no_permute_data.begin(), no_permute_data.end() );
493+
rc = rc ? rc : alp::set< alp::descriptors::use_index >( no_permutation_vec, alp::Scalar< size_t >( 0 ) );
505494

506495
auto dtmp2 = alp::get_view< alp::structures::General >(
507496
dtmp,

include/alp/amf-based/vector.hpp

Lines changed: 245 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,38 @@ namespace alp {
5555
return getInitialized( static_cast< const typename alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend >::base_type & >( v ) );
5656
}
5757

58-
template< typename T, typename Structure, typename View, typename ImfR, typename ImfC, enum Backend backend >
59-
void setInitialized( alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > & v, bool initialized ) noexcept {
58+
template<
59+
typename T, typename Structure, typename View,
60+
typename ImfR, typename ImfC, enum Backend backend
61+
>
62+
void setInitialized(
63+
alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v, bool initialized
64+
) noexcept {
6065
setInitialized( static_cast< typename alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend >::base_type &>( v ), initialized );
6166
}
67+
68+
template<
69+
typename T, typename Structure, typename View,
70+
typename ImfR, typename ImfC, enum Backend backend
71+
>
72+
typename alp::Vector<
73+
T, Structure, Density::Dense, View, ImfR, ImfC, backend
74+
>::iterator
75+
begin(
76+
alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
77+
) noexcept;
78+
79+
template<
80+
typename T, typename Structure, typename View,
81+
typename ImfR, typename ImfC, enum Backend backend
82+
>
83+
typename alp::Vector<
84+
T, Structure, Density::Dense, View, ImfR, ImfC, backend
85+
>::iterator
86+
end(
87+
alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
88+
) noexcept;
89+
6290
} // end namespace ``alp::internal''
6391

6492
/**
@@ -95,22 +123,188 @@ namespace alp {
95123
* accessible via functions.
96124
*
97125
*/
98-
template< typename T, typename Structure, typename View, typename ImfR, typename ImfC, enum Backend backend >
126+
template<
127+
typename T, typename Structure, typename View,
128+
typename ImfR, typename ImfC, enum Backend backend
129+
>
99130
class Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > { };
100131

101132
/*
102133
* ALP vector with a general structure
103134
*/
104-
template< typename T, typename View, typename ImfR, typename ImfC, enum Backend backend >
105-
class Vector< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > :
106-
public Matrix< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > {
135+
template<
136+
typename T, typename View,
137+
typename ImfR, typename ImfC, enum Backend backend
138+
>
139+
class Vector<
140+
T, structures::General, Density::Dense, View, ImfR, ImfC, backend
141+
> : public Matrix< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > {
107142

108143
public:
109144

110-
typedef Vector< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > self_type;
111-
typedef Matrix< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > base_type;
145+
typedef Vector<
146+
T, structures::General, Density::Dense,
147+
View, ImfR, ImfC, backend
148+
> self_type;
149+
150+
typedef Matrix<
151+
T, structures::General, Density::Dense,
152+
View, ImfR, ImfC, backend
153+
> base_type;
112154

113155
private:
156+
class VectorIterator:
157+
public std::iterator< std::random_access_iterator_tag, T > {
158+
159+
friend class Vector<
160+
T, structures::General, Density::Dense,
161+
View, ImfR, ImfC, backend
162+
>;
163+
164+
private:
165+
166+
typedef typename self_type::storage_index_type index_type;
167+
typedef std::iterator<
168+
std::random_access_iterator_tag, T
169+
> std_base_class;
170+
171+
self_type *vec;
172+
index_type position;
173+
174+
VectorIterator( self_type *vptr ) noexcept :
175+
vec( vptr ), position( 0 )
176+
{}
177+
178+
VectorIterator( self_type *vptr, index_type pos ) noexcept :
179+
vec( vptr ), position( pos )
180+
{}
181+
182+
bool equal( const VectorIterator &other ) const noexcept {
183+
return ( vec == other.vec ) && ( position == other.position );
184+
}
185+
186+
bool lessThen( const VectorIterator &other ) const noexcept {
187+
return ( vec == other.vec ) && ( position < other.position );
188+
}
189+
190+
public:
191+
typedef typename std_base_class::pointer pointer;
192+
typedef typename std_base_class::reference reference;
193+
typedef typename std_base_class::difference_type difference_type;
194+
195+
/** Default constructor. */
196+
VectorIterator() noexcept :
197+
vec( nullptr ), position( 0 )
198+
{}
199+
200+
/** Copy constructor. */
201+
VectorIterator( const VectorIterator &other ) noexcept :
202+
vec( other.vec ),
203+
position( other.position )
204+
{}
205+
206+
/** Move constructor. */
207+
VectorIterator( VectorIterator &&other ) :
208+
vec( nullptr ), position( 0 )
209+
{
210+
std::swap( vec, other.vec );
211+
std::swap( position, other.position );
212+
}
213+
214+
/** Copy assignment. */
215+
VectorIterator& operator=( const VectorIterator &other ) noexcept {
216+
vec = other.vec;
217+
position = other.position;
218+
return *this;
219+
}
220+
221+
/** Move assignment. */
222+
VectorIterator& operator=( VectorIterator &&other ) {
223+
vec = nullptr;
224+
position = 0;
225+
std::swap( vec, other.vec );
226+
std::swap( position, other.position );
227+
return *this;
228+
}
229+
230+
reference operator*() const {
231+
return ( *vec )[ position ];
232+
}
233+
234+
VectorIterator& operator++() {
235+
++position;
236+
return *this;
237+
}
238+
239+
VectorIterator& operator--() {
240+
--position;
241+
return *this;
242+
}
243+
244+
VectorIterator operator++( int ) {
245+
return VectorIterator( vec, position++ );
246+
}
247+
248+
VectorIterator operator--( int ) {
249+
return VectorIterator( vec, position-- );
250+
}
251+
252+
VectorIterator operator+( const difference_type &n ) const {
253+
return VectorIterator( vec, ( position + n ) );
254+
}
255+
256+
VectorIterator& operator+=( const difference_type &n ) {
257+
position += n;
258+
return *this;
259+
}
260+
261+
VectorIterator operator-( const difference_type &n ) const {
262+
return VectorIterator( vec, ( position - n ) );
263+
}
264+
265+
VectorIterator& operator-=( const difference_type &n ) {
266+
position -= n;
267+
return *this;
268+
}
269+
270+
reference operator[]( const difference_type &n ) const {
271+
return ( *vec )[ position + n ];
272+
}
273+
274+
bool operator==( const VectorIterator &other ) const {
275+
return equal( other );
276+
}
277+
278+
bool operator!=( const VectorIterator &other ) const {
279+
return !equal( other );
280+
}
281+
282+
bool operator<( const VectorIterator &other ) const {
283+
return lessThen( other );
284+
}
285+
286+
bool operator>( const VectorIterator &other ) const {
287+
return !( lessThen( other ) || equal( other ) );
288+
}
289+
290+
bool operator<=( const VectorIterator &other ) const {
291+
return lessThen( other ) || equal( other );
292+
}
293+
294+
bool operator>=( const VectorIterator &other ) const {
295+
return !lessThen( other );
296+
}
297+
298+
difference_type operator+( const VectorIterator &other ) const {
299+
assert( other.vec == vec );
300+
return position + other.position;
301+
}
302+
303+
difference_type operator-( const VectorIterator &other ) const {
304+
assert( other.vec == vec );
305+
return position - other.position;
306+
}
307+
};
114308

115309
/*********************
116310
Storage info friends
@@ -123,8 +317,21 @@ namespace alp {
123317
return nrows( static_cast< const base_type & >( *this ) );
124318
}
125319

320+
VectorIterator begin() noexcept {
321+
return VectorIterator( this );
322+
}
323+
324+
VectorIterator end() noexcept {
325+
return VectorIterator( this, _length() );
326+
}
327+
126328

127329
public:
330+
331+
typedef VectorIterator iterator;
332+
333+
friend iterator internal::begin<>( self_type &v ) noexcept;
334+
friend iterator internal::end<>( self_type &v ) noexcept;
128335

129336
/** @see Vector::value_type. */
130337
using value_type = T;
@@ -307,6 +514,36 @@ namespace alp {
307514

308515
}; // class Vector with physical container
309516

517+
namespace internal {
518+
519+
template<
520+
typename T, typename Structure, typename View,
521+
typename ImfR, typename ImfC, enum Backend backend
522+
>
523+
typename alp::Vector<
524+
T, Structure, Density::Dense, View, ImfR, ImfC, backend
525+
>::iterator
526+
begin(
527+
alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
528+
) noexcept {
529+
return v.begin();
530+
}
531+
532+
template<
533+
typename T, typename Structure, typename View,
534+
typename ImfR, typename ImfC, enum Backend backend
535+
>
536+
typename alp::Vector<
537+
T, Structure, Density::Dense, View, ImfR, ImfC, backend
538+
>::iterator
539+
end(
540+
alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
541+
) noexcept {
542+
return v.end();
543+
}
544+
545+
} // end namespace ``alp::internal''
546+
310547
/** Identifies any backend's implementation of ALP vector as an ALP vector. */
311548
template< typename T, typename Structure, typename View, typename ImfR, typename ImfC, enum Backend backend >
312549
struct is_vector< Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > > : std::true_type {};

include/alp/base/internalops.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1449,7 +1449,6 @@ namespace alp {
14491449
* At the end of the operation, \f$ c = \min\{a,b\} \f$.
14501450
*/
14511451
static void apply( const left_type * __restrict__ const a, const right_type * __restrict__ const b, result_type * __restrict__ const c ) {
1452-
printf( "Hello from mul\n" );
14531452
if( *a || *b ) {
14541453
*c = static_cast< OUT >( true );
14551454
} else {

0 commit comments

Comments
 (0)