/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/library/utility/fill.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/library/utility/fill.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/library/utility/fill.hpp Source File
fill.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: MIT
2 // Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved.
3 
4 #pragma once
5 
6 #include <algorithm>
7 #include <cmath>
8 #include <iterator>
9 #include <random>
10 #include <type_traits>
11 #include <utility>
12 
13 #include "ck/utility/data_type.hpp"
14 
15 namespace ck {
16 namespace utils {
17 
18 template <typename T>
20 {
21  float a_{-5.f};
22  float b_{5.f};
23 
24  template <typename ForwardIter>
25  void operator()(ForwardIter first, ForwardIter last) const
26  {
27  std::mt19937 gen(11939);
28  std::uniform_real_distribution<float> dis(a_, b_);
29  std::generate(first, last, [&dis, &gen]() { return ck::type_convert<T>(dis(gen)); });
30  }
31 
32  template <typename ForwardRange>
33  auto operator()(ForwardRange&& range) const
34  -> std::void_t<decltype(std::declval<const FillUniformDistribution&>()(
35  std::begin(std::forward<ForwardRange>(range)),
36  std::end(std::forward<ForwardRange>(range))))>
37  {
38  (*this)(std::begin(std::forward<ForwardRange>(range)),
39  std::end(std::forward<ForwardRange>(range)));
40  }
41 };
42 
43 // Normally FillUniformDistributionIntegerValue should use std::uniform_int_distribution as below.
44 // However this produces segfaults in std::mt19937 which look like inifite loop.
45 // template <typename T>
46 // struct FillUniformDistributionIntegerValue
47 // {
48 // int a_{-5};
49 // int b_{5};
50 //
51 // template <typename ForwardIter>
52 // void operator()(ForwardIter first, ForwardIter last) const
53 // {
54 // std::mt19937 gen(11939);
55 // std::uniform_int_distribution<int> dis(a_, b_);
56 // std::generate(
57 // first, last, [&dis, &gen]() { return ck::type_convert<T>(dis(gen)); });
58 // }
59 // };
60 
61 // Workaround for uniform_int_distribution not working as expected. See note above.<
62 template <typename T>
64 {
65  float a_{-5.f};
66  float b_{5.f};
67 
68  template <typename ForwardIter>
69  void operator()(ForwardIter first, ForwardIter last) const
70  {
71  std::mt19937 gen(11939);
72  std::uniform_real_distribution<float> dis(a_, b_);
73  std::generate(
74  first, last, [&dis, &gen]() { return ck::type_convert<T>(std::round(dis(gen))); });
75  }
76 
77  template <typename ForwardRange>
78  auto operator()(ForwardRange&& range) const
79  -> std::void_t<decltype(std::declval<const FillUniformDistributionIntegerValue&>()(
80  std::begin(std::forward<ForwardRange>(range)),
81  std::end(std::forward<ForwardRange>(range))))>
82  {
83  (*this)(std::begin(std::forward<ForwardRange>(range)),
84  std::end(std::forward<ForwardRange>(range)));
85  }
86 };
87 
102 template <typename T>
104 {
106  T step_{1};
107 
108  template <typename ForwardIter>
109  void operator()(ForwardIter first, ForwardIter last) const
110  {
111  std::generate(first, last, [=, *this, n = init_value_]() mutable {
112  auto tmp = n;
113  n += step_;
114  return tmp;
115  });
116  }
117 
118  template <typename ForwardRange>
119  auto operator()(ForwardRange&& range) const
120  -> std::void_t<decltype(std::declval<const FillMonotonicSeq&>()(
121  std::begin(std::forward<ForwardRange>(range)),
122  std::end(std::forward<ForwardRange>(range))))>
123  {
124  (*this)(std::begin(std::forward<ForwardRange>(range)),
125  std::end(std::forward<ForwardRange>(range)));
126  }
127 };
128 
129 template <typename T>
131 {
132  T value_{0};
133 
134  template <typename ForwardIter>
135  void operator()(ForwardIter first, ForwardIter last) const
136  {
137  std::fill(first, last, value_);
138  }
139 
140  template <typename ForwardRange>
141  auto operator()(ForwardRange&& range) const
142  -> std::void_t<decltype(std::declval<const FillConstant&>()(
143  std::begin(std::forward<ForwardRange>(range)),
144  std::end(std::forward<ForwardRange>(range))))>
145  {
146  (*this)(std::begin(std::forward<ForwardRange>(range)),
147  std::end(std::forward<ForwardRange>(range)));
148  }
149 };
150 
151 template <typename T>
153 {
154  // clang-format off
155  static constexpr T valid_sequences[] = {
156  0, 0, 1, 1,
157  0, 1, 0, 1,
158  0, 1, 1, 0,
159  1, 0, 0, 1,
160  1, 0, 1, 0,
161  1, 1, 0, 0,
162  };
163  // clang-format on
164 
165  template <typename ForwardIter>
166  void operator()(ForwardIter first, ForwardIter last) const
167  {
168  std::for_each(first, last, [=, *this, idx = 0](T& elem) mutable {
169  auto tmp_idx = idx;
170  idx += 1;
171  return elem *= valid_sequences[tmp_idx % (sizeof(valid_sequences) / sizeof(T))];
172  });
173  }
174 
175  template <typename ForwardRange>
176  auto operator()(ForwardRange&& range) const
177  -> std::void_t<decltype(std::declval<const TransformIntoStructuralSparsity&>()(
178  std::begin(std::forward<ForwardRange>(range)),
179  std::end(std::forward<ForwardRange>(range))))>
180  {
181  (*this)(std::begin(std::forward<ForwardRange>(range)),
182  std::end(std::forward<ForwardRange>(range)));
183  }
184 };
185 
186 } // namespace utils
187 } // namespace ck
auto fill(OutputRange &&range, const T &init) -> std::void_t< decltype(std::fill(std::begin(std::forward< OutputRange >(range)), std::end(std::forward< OutputRange >(range)), init))>
Definition: algorithm.hpp:25
Definition: ck.hpp:267
Definition: fill.hpp:131
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillConstant & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:141
T value_
Definition: fill.hpp:132
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:135
A functor for filling a container with a monotonically increasing or decreasing sequence.
Definition: fill.hpp:104
T step_
Definition: fill.hpp:106
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillMonotonicSeq & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:119
T init_value_
Definition: fill.hpp:105
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:109
Definition: fill.hpp:20
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillUniformDistribution & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:33
float a_
Definition: fill.hpp:21
float b_
Definition: fill.hpp:22
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:25
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const FillUniformDistributionIntegerValue & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:78
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:69
static constexpr T valid_sequences[]
Definition: fill.hpp:155
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:166
auto operator()(ForwardRange &&range) const -> std::void_t< decltype(std::declval< const TransformIntoStructuralSparsity & >()(std::begin(std::forward< ForwardRange >(range)), std::end(std::forward< ForwardRange >(range))))>
Definition: fill.hpp:176