1 /*
2
3 Copyright (C) 2014, The University of Texas at Austin
4
5 This file is part of libflame and is available under the 3-Clause
6 BSD license, which can be found in the LICENSE file at the top-level
7 directory, or at http://opensource.org/licenses/BSD-3-Clause
8
9 */
10
11 #include "FLAME.h"
12
13 int fla_scomp_f( const void* a, const void* b );
14 int fla_scomp_b( const void* a, const void* b );
15 int fla_dcomp_f( const void* a, const void* b );
16 int fla_dcomp_b( const void* a, const void* b );
17
FLA_Sort(FLA_Direct direct,FLA_Obj x)18 FLA_Error FLA_Sort( FLA_Direct direct, FLA_Obj x )
19 {
20 FLA_Datatype datatype;
21 FLA_Obj x_use;
22 dim_t m_x;
23 dim_t inc_x;
24
25 if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING )
26 FLA_Sort_check( direct, x );
27
28 datatype = FLA_Obj_datatype( x );
29
30 m_x = FLA_Obj_vector_dim( x );
31 inc_x = FLA_Obj_vector_inc( x );
32
33 // If the vector does not have unit stride, copy it to a temporary vector
34 // that does have unit stride.
35 if ( inc_x != 1 )
36 {
37 FLA_Obj_create_copy_of( FLA_NO_TRANSPOSE, x, &x_use );
38 inc_x = FLA_Obj_vector_inc( x_use );
39 }
40 else
41 {
42 x_use = x;
43 }
44
45 switch ( datatype )
46 {
47 case FLA_FLOAT:
48 {
49 float* x_p = ( float* ) FLA_FLOAT_PTR( x_use );
50
51 if ( direct == FLA_FORWARD )
52 FLA_Sort_f_ops( m_x,
53 x_p, inc_x );
54 else // if ( direct == FLA_BACKWARD )
55 FLA_Sort_b_ops( m_x,
56 x_p, inc_x );
57
58 break;
59 }
60
61 case FLA_DOUBLE:
62 {
63 double* x_p = ( double* ) FLA_DOUBLE_PTR( x_use );
64
65 if ( direct == FLA_FORWARD )
66 FLA_Sort_f_opd( m_x,
67 x_p, inc_x );
68 else // if ( direct == FLA_BACKWARD )
69 FLA_Sort_b_opd( m_x,
70 x_p, inc_x );
71
72 break;
73 }
74
75 }
76
77 if ( inc_x != 1 )
78 {
79 FLA_Copy( x_use, x );
80 FLA_Obj_free( &x_use );
81 }
82
83 return FLA_SUCCESS;
84 }
85
86
87
FLA_Sort_f_ops(int m_x,float * x,int inc_x)88 FLA_Error FLA_Sort_f_ops( int m_x,
89 float* x, int inc_x )
90 {
91 qsort( x,
92 m_x,
93 sizeof( float ),
94 fla_scomp_f );
95
96 return FLA_SUCCESS;
97 }
98
FLA_Sort_b_ops(int m_x,float * x,int inc_x)99 FLA_Error FLA_Sort_b_ops( int m_x,
100 float* x, int inc_x )
101 {
102 qsort( x,
103 m_x,
104 sizeof( float ),
105 fla_scomp_b );
106
107 return FLA_SUCCESS;
108 }
109
FLA_Sort_f_opd(int m_x,double * x,int inc_x)110 FLA_Error FLA_Sort_f_opd( int m_x,
111 double* x, int inc_x )
112 {
113 qsort( x,
114 m_x,
115 sizeof( double ),
116 fla_dcomp_f );
117
118 return FLA_SUCCESS;
119 }
120
FLA_Sort_b_opd(int m_x,double * x,int inc_x)121 FLA_Error FLA_Sort_b_opd( int m_x,
122 double* x, int inc_x )
123 {
124 qsort( x,
125 m_x,
126 sizeof( double ),
127 fla_dcomp_b );
128
129 return FLA_SUCCESS;
130 }
131
132
133
134
135
fla_scomp_f(const void * a,const void * b)136 int fla_scomp_f( const void* a, const void* b )
137 {
138 float* da = ( float* ) a;
139 float* db = ( float* ) b;
140 int r_val;
141
142 if ( *da < *db ) r_val = -1;
143 else if ( *da > *db ) r_val = 1;
144 else r_val = 0;
145
146 return r_val;
147 }
148
fla_scomp_b(const void * a,const void * b)149 int fla_scomp_b( const void* a, const void* b )
150 {
151 float* da = ( float* ) a;
152 float* db = ( float* ) b;
153 int r_val;
154
155 if ( *da < *db ) r_val = 1;
156 else if ( *da > *db ) r_val = -1;
157 else r_val = 0;
158
159 return r_val;
160 }
161
fla_dcomp_f(const void * a,const void * b)162 int fla_dcomp_f( const void* a, const void* b )
163 {
164 double* da = ( double* ) a;
165 double* db = ( double* ) b;
166 int r_val;
167
168 if ( *da < *db ) r_val = -1;
169 else if ( *da > *db ) r_val = 1;
170 else r_val = 0;
171
172 return r_val;
173 }
174
fla_dcomp_b(const void * a,const void * b)175 int fla_dcomp_b( const void* a, const void* b )
176 {
177 double* da = ( double* ) a;
178 double* db = ( double* ) b;
179 int r_val;
180
181 if ( *da < *db ) r_val = 1;
182 else if ( *da > *db ) r_val = -1;
183 else r_val = 0;
184
185 return r_val;
186 }
187
188