1 #ifndef MHO_CyclicRotator_HH__
2 #define MHO_CyclicRotator_HH__
34 for(std::size_t i = 0; i < XArrayType::rank::value; i++)
36 fDimensionSize[i] = 0;
54 if(dimension_index < XArrayType::rank::value)
56 fOffsets[dimension_index] = offset_value;
61 "error, rotation offset for dimension: " << dimension_index <<
", exceeds array rank." << eom);
78 in->GetDimensions(fDimensionSize);
99 for(std::size_t i = 0; i < XArrayType::rank::value; i++)
103 fModuloOffsets[i] = positive_modulo(fOffsets[i], fDimensionSize[i]);
107 fModuloOffsets[i] = 0;
109 IfTableRotateAxis(in, in, i);
112 size_t index[XArrayType::rank::value];
113 size_t non_active_dimension_size[XArrayType::rank::value - 1];
114 size_t non_active_dimension_value[XArrayType::rank::value - 1];
115 size_t non_active_dimension_index[XArrayType::rank::value - 1];
118 for(
size_t d = 0; d < XArrayType::rank::value; d++)
126 size_t stride = in->GetStride(d);
127 for(
size_t i = 0; i < XArrayType::rank::value; i++)
131 n_rot *= fDimensionSize[i];
132 non_active_dimension_index[count] = i;
133 non_active_dimension_size[count] = fDimensionSize[i];
139 for(
size_t n = 0; n < n_rot; n++)
143 n, non_active_dimension_size, non_active_dimension_value);
146 for(
size_t i = 0; i < XArrayType::rank::value - 1; i++)
148 index[non_active_dimension_index[i]] = non_active_dimension_value[i];
152 size_t data_location;
155 MHO_NDArrayMath::OffsetFromRowMajorIndex< XArrayType::rank::value >(fDimensionSize, index);
158 auto it_first = in->stride_iterator_at(data_location, stride);
159 auto it_nfirst = it_first + fModuloOffsets[d];
160 auto it_end = it_first + fDimensionSize[d];
161 std::rotate(it_first, it_nfirst, it_end);
179 if(in !=
nullptr && out !=
nullptr)
181 in->GetDimensions(fDimensionSize);
183 std::size_t in_dim[XArrayType::rank::value];
184 std::size_t out_dim[XArrayType::rank::value];
185 in->GetDimensions(in_dim);
186 out->GetDimensions(out_dim);
188 bool have_to_resize =
false;
189 for(std::size_t i = 0; i < XArrayType::rank::value; i++)
191 if(out_dim[i] != in_dim[i])
193 have_to_resize =
true;
206 fInitialized =
false;
223 for(std::size_t i = 0; i < XArrayType::rank::value; i++)
227 fModuloOffsets[i] = positive_modulo(fOffsets[i], fDimensionSize[i]);
229 IfTableRotateAxis(in, out, i);
232 auto in_iter = in->cbegin();
233 auto in_iter_end = in->cend();
234 const std::size_t* out_dim = out->GetDimensions();
235 const std::size_t* in_dim = in->GetDimensions();
236 std::array< std::size_t, XArrayType::rank::value > in_loc;
237 while(in_iter != in_iter_end)
239 MHO_NDArrayMath::RowMajorIndexFromOffset< XArrayType::rank::value >(in_iter.GetOffset(), in_dim,
241 for(std::size_t i = 0; i < XArrayType::rank::value; i++)
243 fWorkspace[i] = positive_modulo(in_loc[i] - fModuloOffsets[i], out_dim[i]);
245 std::size_t out_loc = out->GetOffsetForIndices(fWorkspace);
246 (*(out))[out_loc] = *in_iter;
264 template<
typename XCheckType = XArrayType >
265 typename std::enable_if< !std::is_base_of< MHO_TableContainerBase, XCheckType >::value,
void >::type
266 IfTableRotateAxis(
const XArrayType* , XArrayType* , std::size_t ){};
278 template<
typename XCheckType = XArrayType >
279 typename std::enable_if< std::is_base_of< MHO_TableContainerBase, XCheckType >::value,
void >::type
280 IfTableRotateAxis(
const XArrayType* in, XArrayType* out, std::size_t dim)
282 RotateAxis axis_rot(fOffsets[dim]);
283 apply_at2< typename XArrayType::axis_pack_tuple_type, RotateAxis >(*in, *out, dim, axis_rot);
292 RotateAxis(std::size_t offset): fOffset(offset){};
295 template<
typename XAxisType >
void operator()(
const XAxisType& axis1, XAxisType& axis2)
306 for(i = 0; i < n; i++)
308 j = ((i - fOffset) % n + n) % n;
337 std::size_t fDimensionSize[XArrayType::rank::value];
338 int64_t fOffsets[XArrayType::rank::value];
339 int64_t fModuloOffsets[XArrayType::rank::value];
340 std::size_t fWorkspace[XArrayType::rank::value];
#define msg_error(xKEY, xCONTENT)
Definition: MHO_Message.hh:244
Class MHO_CyclicRotator.
Definition: MHO_CyclicRotator.hh:29
void SetOffset(std::size_t dimension_index, int64_t offset_value)
set the offset for the cyclic rotation in each dimension (default is zero...do nothing)
Definition: MHO_CyclicRotator.hh:52
virtual ~MHO_CyclicRotator()
Definition: MHO_CyclicRotator.hh:41
virtual bool InitializeOutOfPlace(const XArrayType *in, XArrayType *out) override
Function InitializeOutOfPlace - executes the rotation.
Definition: MHO_CyclicRotator.hh:177
MHO_CyclicRotator()
Definition: MHO_CyclicRotator.hh:31
virtual bool InitializeInPlace(XArrayType *in) override
Initializes in-place rotation and sets flag if input is not nullptr.
Definition: MHO_CyclicRotator.hh:74
virtual bool ExecuteOutOfPlace(const XArrayType *in, XArrayType *out) override
Function ExecuteOutOfPlace - executes the rotation.
Definition: MHO_CyclicRotator.hh:219
virtual bool ExecuteInPlace(XArrayType *in) override
Function ExecuteInPlace - executes the rotation.
Definition: MHO_CyclicRotator.hh:91
static void RowMajorIndexFromOffset(std::size_t offset, const std::size_t *DimSize, std::size_t *Index)
Function RowMajorIndexFromOffset.
Definition: MHO_NDArrayMath.hh:121
Class MHO_UnaryOperator.
Definition: MHO_UnaryOperator.hh:24
Definition: MHO_ChannelLabeler.hh:17