TiledArray  0.7.0
unary_reduction.h
Go to the documentation of this file.
1 /*
2  * This file is a part of TiledArray.
3  * Copyright (C) 2014 Virginia Tech
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Justus Calvin
19  * Department of Chemistry, Virginia Tech
20  *
21  * unary_reduction.h
22  * Apr 2, 2014
23  *
24  */
25 
26 #ifndef TILEDARRAY_TILE_OP_UNARY_REDUCTION_H__INCLUDED
27 #define TILEDARRAY_TILE_OP_UNARY_REDUCTION_H__INCLUDED
28 
30 
31 namespace TiledArray {
32 
34 
37  template <typename Tile>
38  class SumReduction {
39  public:
40  // typedefs
41  using result_type = decltype(sum(std::declval<Tile>()));
43 
44  // Reduction functions
45 
46  // Make an empty result object
47  result_type operator()() const { return result_type(0); }
48 
49  // Post process the result
50  const result_type& operator()(const result_type& result) const { return result; }
51 
52  // Reduce two result objects
53  void operator()(result_type& result, const result_type& arg) const {
54  result += arg;
55  }
56 
57  // Reduce an argument
58  void operator()(result_type& result, const argument_type& arg) const {
59  using TiledArray::sum;
60  result += sum(arg);
61  }
62  }; // class SumReduction
63 
65 
68  template <typename Tile>
70  public:
71  // typedefs
72  using result_type = decltype(product(std::declval<Tile>()));
74 
75  // Reduction functions
76 
77  // Make an empty result object
78  result_type operator()() const { return result_type(1); }
79 
80  // Post process the result
81  const result_type& operator()(const result_type& result) const { return result; }
82 
83  // Reduce two result objects
84  void operator()(result_type& result, const result_type& arg) const {
85  result *= arg;
86  }
87 
88  // Reduce an argument
89  void operator()(result_type& result, const argument_type& arg) const {
90  using TiledArray::product;
91  result *= product(arg);
92  }
93 
94  }; // class ProductReduction
95 
97 
101  template <typename Tile>
103  public:
104  // typedefs
105  using result_type = decltype(trace(std::declval<Tile>()));
107 
108  // Reduction functions
109 
110  // Make an empty result object
111  result_type operator()() const { return result_type(0); }
112 
113  // Post process the result
114  const result_type& operator()(const result_type& result) const { return result; }
115 
116  // Reduce two result objects
117  void operator()(result_type& result, const result_type& arg) const {
118  result += arg;
119  }
120 
121  // Reduce an argument
122  void operator()(result_type& result, const argument_type& arg) const {
123  using TiledArray::trace;
124  result += trace(arg);
125  }
126 
127  }; // class TraceReduction
128 
130 
134  template <typename Tile>
136  public:
137  // typedefs
138  using result_type = decltype(squared_norm(std::declval<Tile>()));
140 
141  // Reduction functions
142 
143  // Make an empty result object
144  result_type operator()() const { return result_type(0); }
145 
146  // Post process the result
147  const result_type& operator()(const result_type& result) const {
148  return result;
149  }
150 
151  // Reduce two result objects
152  void operator()(result_type& result, const result_type& arg) const {
153  result += arg;
154  }
155 
156  // Reduce an argument
157  void operator()(result_type& result, const argument_type& arg) const {
159  result += squared_norm(arg);
160  }
161 
162  }; // class SquaredNormReduction
163 
165 
170  template <typename Tile, typename Enabler = void>
172 
173  template <typename Tile>
174  class MinReduction<Tile, typename std::enable_if<detail::is_strictly_ordered<
175  detail::numeric_t<Tile>>::value>::type> {
176  public:
177  // typedefs
178  using result_type = decltype(min(std::declval<Tile>()));
180 
181  // Reduction functions
182 
183  // Make an empty result object
185 
186  // Post process the result
187  const result_type& operator()(const result_type& result) const { return result; }
188 
189  // Reduce two result objects
190  void operator()(result_type& result, const result_type& arg) const {
191  result = std::min(result, arg);
192  }
193 
194  // Reduce an argument
195  void operator()(result_type& result, const argument_type& arg) const {
196  using TiledArray::min;
197  result = std::min(result, min(arg));
198  }
199 
200  }; // class MinReduction
201 
203 
208  template <typename Tile, typename Enabler = void>
210 
211  template <typename Tile>
212  class MaxReduction<Tile, typename std::enable_if<detail::is_strictly_ordered<
213  detail::numeric_t<Tile>>::value>::type> {
214  public:
215  // typedefs
216  using result_type = decltype(max(std::declval<Tile>()));
218 
219  // Reduction functions
220 
221  // Make an empty result object
223 
224  // Post process the result
225  const result_type& operator()(const result_type& result) const { return result; }
226 
227  // Reduce two result objects
228  void operator()(result_type& result, const result_type& arg) const {
229  result = std::max(result, arg);
230  }
231 
232  // Reduce an argument
233  void operator()(result_type& result, const argument_type& arg) const {
234  using TiledArray::max;
235  result = std::max(result, max(arg));
236  }
237 
238  }; // class MaxReduction
239 
241 
245  template <typename Tile>
247  public:
248  // typedefs
249  using result_type = decltype(abs_min(std::declval<Tile>()));
251 
252  // Reduction functions
253 
254  // Make an empty result object
256 
257  // Post process the result
258  const result_type& operator()(const result_type& result) const { return result; }
259 
260  // Reduce two result objects
261  void operator()(result_type& result, const result_type& arg) const {
262  result = std::min(result, std::abs(arg));
263  }
264 
265  // Reduce an argument
266  void operator()(result_type& result, const argument_type& arg) const {
267  using TiledArray::abs_min;
268  result = std::min(result, abs_min(arg));
269  }
270 
271  }; // class AbsMinReduction
272 
274 
277  template <typename Tile>
279  public:
280  // typedefs
281  using result_type = decltype(abs_max(std::declval<Tile>()));
283 
284  // Reduction functions
285 
286  // Make an empty result object
287  result_type operator()() const { return result_type(0); }
288 
289  // Post process the result
290  const result_type& operator()(const result_type& result) const { return result; }
291 
292  // Reduce two result objects
293  void operator()(result_type& result, const result_type& arg) const {
294  result = std::max(result, std::abs(arg));
295  }
296 
297  // Reduce an argument
298  void operator()(result_type& result, const argument_type& arg) const {
299  using TiledArray::abs_max;
300  result = std::max(result, abs_max(arg));
301  }
302 
303  }; // class AbsMaxReduction
304 
305 } // namespace TiledArray
306 
307 #endif // TILEDARRAY_TILE_OP_UNARY_REDUCTION_H__INCLUDED
const result_type & operator()(const result_type &result) const
void operator()(result_type &result, const result_type &arg) const
decltype(auto) product(const Tile< Arg > &arg)
Multiply the elements of a tile.
Definition: tile.h:911
decltype(auto) min(const Tile< Arg > &arg)
Minimum element of a tile.
Definition: tile.h:948
decltype(auto) squared_norm(const Tile< Arg > &arg)
Squared vector 2-norm of the elements of a tile.
Definition: tile.h:921
const result_type & operator()(const result_type &result) const
const result_type & operator()(const result_type &result) const
void operator()(result_type &result, const argument_type &arg) const
STL namespace.
Tile sum reduction.
const result_type & operator()(const result_type &result) const
Minabs tile reduction.
void operator()(result_type &result, const argument_type &arg) const
KroneckerDeltaTile< _N >::numeric_type max(const KroneckerDeltaTile< _N > &arg)
void operator()(result_type &result, const argument_type &arg) const
auto abs(const ComplexConjugate< T > &a)
Definition: complex.h:247
void operator()(result_type &result, const argument_type &arg) const
result_type operator()() const
result_type operator()() const
decltype(abs_max(std::declval< Tile >())) result_type
decltype(auto) abs_min(const Tile< Arg > &arg)
Absolute mainimum element of a tile.
Definition: tile.h:966
decltype(squared_norm(std::declval< Tile >())) result_type
Tile product reduction.
void operator()(result_type &result, const result_type &arg) const
void operator()(result_type &result, const result_type &arg) const
decltype(auto) abs_max(const Tile< Arg > &arg)
Absolute maximum element of a tile.
Definition: tile.h:957
void operator()(result_type &result, const argument_type &arg) const
decltype(product(std::declval< Tile >())) result_type
result_type operator()() const
Maxabs tile reduction.
decltype(auto) max(const Tile< Arg > &arg)
Maximum element of a tile.
Definition: tile.h:939
const result_type & operator()(const result_type &result) const
const result_type & operator()(const result_type &result) const
result_type operator()() const
Maximum tile reduction.
decltype(auto) sum(const Tile< Arg > &arg)
Sum the elements of a tile.
Definition: tile.h:902
decltype(trace(std::declval< Tile >())) result_type
void operator()(result_type &result, const result_type &arg) const
void operator()(result_type &result, const result_type &arg) const
Minimum tile reduction.
Squared norm tile reduction.
Tile trace reduction.
KroneckerDeltaTile< _N >::numeric_type min(const KroneckerDeltaTile< _N > &arg)
result_type operator()() const
An N-dimensional shallow copy wrapper for tile objects.
Definition: tile.h:80
void operator()(result_type &result, const argument_type &arg) const
decltype(auto) trace(const Tile< Arg > &arg)
Sum the hyper-diagonal elements a tile.
Definition: tile.h:893
void operator()(result_type &result, const result_type &arg) const
decltype(sum(std::declval< Tile >())) result_type
decltype(abs_min(std::declval< Tile >())) result_type