Cheetah - SKA - PSS - Prototype Time Domain Search Pipeline
MedianScrunch.cu
1 #include "cheetah/dred/cuda/detail/MedianScrunch.cuh"
2 
3 namespace ska {
4 namespace cheetah {
5 namespace dred {
6 namespace cuda {
7 namespace detail {
8 
9 template <typename T>
10 inline __host__ __device__ T median3(T a, T b, T c)
11 {
12  return a < b ? b < c ? b
13  : a < c ? c : a
14  : a < c ? a
15  : b < c ? c : b;
16 }
17 
18 template <typename T>
19 inline __host__ __device__ T median4(T a, T b, T c, T d)
20 {
21  return a < c ? b < d ? a < b ? c < d ? 0.5f*(b+c) : 0.5f*(b+d)
22  : c < d ? 0.5f*(a+c) : 0.5f*(a+d)
23  : a < d ? c < b ? 0.5f*(d+c) : 0.5f*(b+d)
24  : c < b ? 0.5f*(a+c) : 0.5f*(a+b)
25  : b < d ? c < b ? a < d ? 0.5f*(b+a) : 0.5f*(b+d)
26  : a < d ? 0.5f*(a+c) : 0.5f*(c+d)
27  : c < d ? a < b ? 0.5f*(d+a) : 0.5f*(b+d)
28  : a < b ? 0.5f*(a+c) : 0.5f*(c+b);
29 }
30 
31 template <typename T>
32 inline __host__ __device__ T median5(T a, T b, T c, T d, T e)
33 {
34  return b < a ? d < c ? b < d ? a < e ? a < d ? e < d ? e : d
35  : c < a ? c : a
36  : e < d ? a < d ? a : d
37  : c < e ? c : e
38  : c < e ? b < c ? a < c ? a : c
39  : e < b ? e : b
40  : b < e ? a < e ? a : e
41  : c < b ? c : b
42  : b < c ? a < e ? a < c ? e < c ? e : c
43  : d < a ? d : a
44  : e < c ? a < c ? a : c
45  : d < e ? d : e
46  : d < e ? b < d ? a < d ? a : d
47  : e < b ? e : b
48  : b < e ? a < e ? a : e
49  : d < b ? d : b
50  : d < c ? a < d ? b < e ? b < d ? e < d ? e : d
51  : c < b ? c : b
52  : e < d ? b < d ? b : d
53  : c < e ? c : e
54  : c < e ? a < c ? b < c ? b : c
55  : e < a ? e : a
56  : a < e ? b < e ? b : e
57  : c < a ? c : a
58  : a < c ? b < e ? b < c ? e < c ? e : c
59  : d < b ? d : b
60  : e < c ? b < c ? b : c
61  : d < e ? d : e
62  : d < e ? a < d ? b < d ? b : d
63  : e < a ? e : a
64  : a < e ? b < e ? b : e
65  : d < a ? d : a;
66 }
67 
68 template <typename T>
69 Median5Functor<T>::Median5Functor(const T* in)
70  :_in(in)
71 {
72 }
73 
74 template <typename T>
75 inline __host__ __device__ T Median5Functor<T>::operator()(unsigned int i) const
76 {
77  T a = _in[5*i+0];
78  T b = _in[5*i+1];
79  T c = _in[5*i+2];
80  T d = _in[5*i+3];
81  T e = _in[5*i+4];
82  return median5<T>(a, b, c, d, e);
83 }
84 
85 template <typename T>
86 LinearStretchFunctor<T>::LinearStretchFunctor(const T* in, unsigned in_size, float step)
87  : _in(in)
88  , _in_size(in_size)
89  , _step(step)
90  , _correction(((int)(_step/2))/_step)
91 {
92 }
93 
94 template <typename T>
95 T LinearStretchFunctor<T>::operator()(unsigned out_idx) const
96 {
97  float fidx = ((float)out_idx) / _step - _correction;
98  unsigned idx = (unsigned) fidx;
99  if (fidx<0)
100  idx = 0;
101  else if (idx + 1 >= _in_size)
102  idx = _in_size-2;
103  return _in[idx] + ((_in[idx+1] - _in[idx]) * (fidx-idx));
104 }
105 
106 } // namespace detail
107 } // namespace cuda
108 } // namespace dred
109 } // namespace cheetah
110 } // namespace ska
Some limits and constants for FLDO.
Definition: Brdz.h:35