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

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

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/docs-7.0.0/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 -> std::void_t<
142  decltype(std::declval<const FillConstant&>()(std::begin(std::forward<ForwardRange>(range)),
143  std::end(std::forward<ForwardRange>(range))))>
144  {
145  (*this)(std::begin(std::forward<ForwardRange>(range)),
146  std::end(std::forward<ForwardRange>(range)));
147  }
148 };
149 
150 template <typename T>
152 {
153  // clang-format off
154  static constexpr T valid_sequences[] = {
155  0, 0, 1, 1,
156  0, 1, 0, 1,
157  0, 1, 1, 0,
158  1, 0, 0, 1,
159  1, 0, 1, 0,
160  1, 1, 0, 0,
161  };
162  // clang-format on
163 
164  template <typename ForwardIter>
165  void operator()(ForwardIter first, ForwardIter last) const
166  {
167  std::for_each(first, last, [=, *this, idx = 0](T& elem) mutable {
168  auto tmp_idx = idx;
169  idx += 1;
170  return elem *= valid_sequences[tmp_idx % (sizeof(valid_sequences) / sizeof(T))];
171  });
172  }
173 
174  template <typename ForwardRange>
175  auto operator()(ForwardRange&& range) const
176  -> std::void_t<decltype(std::declval<const TransformIntoStructuralSparsity&>()(
177  std::begin(std::forward<ForwardRange>(range)),
178  std::end(std::forward<ForwardRange>(range))))>
179  {
180  (*this)(std::begin(std::forward<ForwardRange>(range)),
181  std::end(std::forward<ForwardRange>(range)));
182  }
183 };
184 
185 } // namespace utils
186 } // 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:269
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:154
void operator()(ForwardIter first, ForwardIter last) const
Definition: fill.hpp:165
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:175