Stratax 0.4.0rc1
Loading...
Searching...
No Matches
Comparison.hpp
Go to the documentation of this file.
1
9#pragma once
10
11#include <functional>
12
17
18namespace stratax::core::comparison_detail {
19
35template<Array L, Array R, typename Op>
37 const L& lhs,
38 const R& rhs,
39 Op op)
40{
41 using result_type =
43 L,
44 R,
46
47 const auto result_shape =
48 stratax::core::broadcast_detail::array_result_shape(lhs, rhs);
49
50 result_type result(result_shape);
51
52 for (std::size_t i = 0; i < result.size(); ++i)
53 {
54 const std::size_t lhs_index =
55 stratax::core::broadcast_detail::flat_operand_index(
56 i,
57 result_shape,
58 lhs.shape());
59
60 const std::size_t rhs_index =
61 stratax::core::broadcast_detail::flat_operand_index(
62 i,
63 result_shape,
64 rhs.shape());
65
66 result[i] = static_cast<stratax::dtype::bool_>(
67 op(lhs[lhs_index], rhs[rhs_index]));
68 }
69
70 return result;
71}
72
80template<Array A, DType Scalar, typename Op>
82 const A& lhs,
83 const Scalar& rhs,
84 Op op)
85{
86 using result_type =
88 A,
90
91 result_type result(lhs.shape());
92
93 auto out = result.begin();
94
95 for (auto it = lhs.begin(); it != lhs.end(); ++it, ++out)
96 {
97 *out = static_cast<stratax::dtype::bool_>(
98 op(*it, rhs));
99 }
100
101 return result;
102}
103
111template<DType Scalar, Array A, typename Op>
113 const Scalar& lhs,
114 const A& rhs,
115 Op op)
116{
117 using result_type =
119 A,
121
122 result_type result(rhs.shape());
123
124 auto out = result.begin();
125
126 for (auto it = rhs.begin(); it != rhs.end(); ++it, ++out)
127 {
128 *out = static_cast<stratax::dtype::bool_>(
129 op(lhs, *it));
130 }
131
132 return result;
133}
134
142template<Array L, Array R>
143[[nodiscard]] bool array_equal(const L& lhs, const R& rhs)
144{
145 if (lhs.shape() != rhs.shape())
146 {
147 return false;
148 }
149
150 auto lhs_it = lhs.begin();
151 auto rhs_it = rhs.begin();
152
153 for (; lhs_it != lhs.end(); ++lhs_it, ++rhs_it)
154 {
155 if (*lhs_it != *rhs_it)
156 {
157 return false;
158 }
159 }
160
161 return true;
162}
163
164} // namespace stratax::core::comparison_detail
165
172template<Array L, Array R>
173auto equal(const L& lhs, const R& rhs)
174{
175 return stratax::core::comparison_detail::comparison_op(
176 lhs, rhs, std::equal_to<>{});
177}
178
185template<Array L, Array R>
186auto not_equal(const L& lhs, const R& rhs)
187{
188 return stratax::core::comparison_detail::comparison_op(
189 lhs, rhs, std::not_equal_to<>{});
190}
191
199template<Array L, Array R>
200requires (
203)
204auto less(const L& lhs, const R& rhs)
205{
206 return stratax::core::comparison_detail::comparison_op(
207 lhs, rhs, std::less<>{});
208}
209
217template<Array L, Array R>
218requires (
221)
222auto less_equal(const L& lhs, const R& rhs)
223{
224 return stratax::core::comparison_detail::comparison_op(
225 lhs, rhs, std::less_equal<>{});
226}
227
235template<Array L, Array R>
236requires (
239)
240auto greater(const L& lhs, const R& rhs)
241{
242 return stratax::core::comparison_detail::comparison_op(
243 lhs, rhs, std::greater<>{});
244}
245
253template<Array L, Array R>
254requires (
257)
258auto greater_equal(const L& lhs, const R& rhs)
259{
260 return stratax::core::comparison_detail::comparison_op(
261 lhs, rhs, std::greater_equal<>{});
262}
263
269template<Array A, DType Scalar>
270auto equal(const A& lhs, const Scalar& rhs)
271{
272 return stratax::core::comparison_detail::comparison_scalar_op(
273 lhs, rhs, std::equal_to<>{});
274}
275
281template<DType Scalar, Array A>
282auto equal(const Scalar& lhs, const A& rhs)
283{
284 return stratax::core::comparison_detail::comparison_scalar_op(
285 lhs, rhs, std::equal_to<>{});
286}
287
293template<Array A, DType Scalar>
294auto not_equal(const A& lhs, const Scalar& rhs)
295{
296 return stratax::core::comparison_detail::comparison_scalar_op(
297 lhs, rhs, std::not_equal_to<>{});
298}
299
305template<DType Scalar, Array A>
306auto not_equal(const Scalar& lhs, const A& rhs)
307{
308 return stratax::core::comparison_detail::comparison_scalar_op(
309 lhs, rhs, std::not_equal_to<>{});
310}
311
317template<Array A, Ordered Scalar>
319auto less(const A& lhs, const Scalar& rhs)
320{
321 return stratax::core::comparison_detail::comparison_scalar_op(
322 lhs, rhs, std::less<>{});
323}
324
330template<Ordered Scalar, Array A>
332auto less(const Scalar& lhs, const A& rhs)
333{
334 return stratax::core::comparison_detail::comparison_scalar_op(
335 lhs, rhs, std::less<>{});
336}
337
343template<Array A, Ordered Scalar>
345auto less_equal(const A& lhs, const Scalar& rhs)
346{
347 return stratax::core::comparison_detail::comparison_scalar_op(
348 lhs, rhs, std::less_equal<>{});
349}
350
356template<Ordered Scalar, Array A>
358auto less_equal(const Scalar& lhs, const A& rhs)
359{
360 return stratax::core::comparison_detail::comparison_scalar_op(
361 lhs, rhs, std::less_equal<>{});
362}
363
369template<Array A, Ordered Scalar>
371auto greater(const A& lhs, const Scalar& rhs)
372{
373 return stratax::core::comparison_detail::comparison_scalar_op(
374 lhs, rhs, std::greater<>{});
375}
376
382template<Ordered Scalar, Array A>
384auto greater(const Scalar& lhs, const A& rhs)
385{
386 return stratax::core::comparison_detail::comparison_scalar_op(
387 lhs, rhs, std::greater<>{});
388}
389
395template<Array A, Ordered Scalar>
397auto greater_equal(const A& lhs, const Scalar& rhs)
398{
399 return stratax::core::comparison_detail::comparison_scalar_op(
400 lhs, rhs, std::greater_equal<>{});
401}
402
408template<Ordered Scalar, Array A>
410auto greater_equal(const Scalar& lhs, const A& rhs)
411{
412 return stratax::core::comparison_detail::comparison_scalar_op(
413 lhs, rhs, std::greater_equal<>{});
414}
415
420template<Array L, Array R>
421auto operator==(const L& lhs, const R& rhs)
422{
423 return equal(lhs, rhs);
424}
425
430template<Array L, Array R>
431auto operator!=(const L& lhs, const R& rhs)
432{
433 return not_equal(lhs, rhs);
434}
435
440template<Array L, Array R>
441requires (
444)
445auto operator<(const L& lhs, const R& rhs)
446{
447 return less(lhs, rhs);
448}
449
454template<Array L, Array R>
455requires (
458)
459auto operator<=(const L& lhs, const R& rhs)
460{
461 return less_equal(lhs, rhs);
462}
463
468template<Array L, Array R>
469requires (
472)
473auto operator>(const L& lhs, const R& rhs)
474{
475 return greater(lhs, rhs);
476}
477
482template<Array L, Array R>
483requires (
486)
487auto operator>=(const L& lhs, const R& rhs)
488{
489 return greater_equal(lhs, rhs);
490}
491
496template<Array A, DType Scalar>
497auto operator==(const A& lhs, const Scalar& rhs)
498{
499 return equal(lhs, rhs);
500}
501
506template<DType Scalar, Array A>
507auto operator==(const Scalar& lhs, const A& rhs)
508{
509 return equal(lhs, rhs);
510}
511
516template<Array A, DType Scalar>
517auto operator!=(const A& lhs, const Scalar& rhs)
518{
519 return not_equal(lhs, rhs);
520}
521
526template<DType Scalar, Array A>
527auto operator!=(const Scalar& lhs, const A& rhs)
528{
529 return not_equal(lhs, rhs);
530}
531
536template<Array A, Ordered Scalar>
538auto operator<(const A& lhs, const Scalar& rhs)
539{
540 return less(lhs, rhs);
541}
542
547template<Ordered Scalar, Array A>
549auto operator<(const Scalar& lhs, const A& rhs)
550{
551 return less(lhs, rhs);
552}
553
558template<Array A, Ordered Scalar>
560auto operator<=(const A& lhs, const Scalar& rhs)
561{
562 return less_equal(lhs, rhs);
563}
564
569template<Ordered Scalar, Array A>
571auto operator<=(const Scalar& lhs, const A& rhs)
572{
573 return less_equal(lhs, rhs);
574}
575
580template<Array A, Ordered Scalar>
582auto operator>(const A& lhs, const Scalar& rhs)
583{
584 return greater(lhs, rhs);
585}
586
591template<Ordered Scalar, Array A>
593auto operator>(const Scalar& lhs, const A& rhs)
594{
595 return greater(lhs, rhs);
596}
597
602template<Array A, Ordered Scalar>
604auto operator>=(const A& lhs, const Scalar& rhs)
605{
606 return greater_equal(lhs, rhs);
607}
608
613template<Ordered Scalar, Array A>
615auto operator>=(const Scalar& lhs, const A& rhs)
616{
617 return greater_equal(lhs, rhs);
618}
Result-container rebinding and promotion for owning arrays.
typename PromoteArray< std::remove_cvref_t< L >, std::remove_cvref_t< R >, std::remove_cvref_t< T > >::type promote_array_t
Convenience alias for the promoted array container type.
typename RebindArray< std::remove_cvref_t< A >, std::remove_cvref_t< T > >::type rebind_array_t
Convenience alias for rebinding an array to a new value type.
Trailing-axis shape compatibility and element projection.
auto operator==(const L &lhs, const R &rhs)
Element-wise array equality shorthand for equal().
auto operator<(const L &lhs, const R &rhs)
Element-wise array less-than shorthand for less().
auto operator>=(const L &lhs, const R &rhs)
Element-wise array greater-than-or-equal shorthand for greater_equal().
auto greater(const L &lhs, const R &rhs)
Tests each broadcasted left element for strict ordering above the corresponding right element.
auto operator!=(const L &lhs, const R &rhs)
Element-wise array inequality shorthand for not_equal().
auto comparison_op(const L &lhs, const R &rhs, Op op)
Applies an element-wise comparison to two broadcast-compatible arrays.
auto equal(const L &lhs, const R &rhs)
Compares two arrays for element-wise equality with broadcasting.
auto greater_equal(const L &lhs, const R &rhs)
Tests each broadcasted left element for ordering above or equal to the corresponding right element.
auto operator<=(const L &lhs, const R &rhs)
Element-wise array less-than-or-equal shorthand for less_equal().
auto less_equal(const L &lhs, const R &rhs)
Tests each broadcasted left element for ordering below or equal to the corresponding right element.
auto less(const L &lhs, const R &rhs)
Tests each broadcasted left element for strict ordering below the corresponding right element.
bool array_equal(const L &lhs, const R &rhs)
Tests whether two arrays have identical shapes and element values.
auto comparison_scalar_op(const A &lhs, const Scalar &rhs, Op op)
Compares every array element with a scalar on the right.
auto not_equal(const L &lhs, const R &rhs)
Compares two arrays for element-wise inequality with broadcasting.
auto operator>(const L &lhs, const R &rhs)
Element-wise array greater-than shorthand for greater().
Dtype and array interface concepts.
Supported scalar dtype aliases.
bool bool_
Boolean dtype.
Definition Types.hpp:24
Supported non-complex dtype, including bool; floating-point NaNs need not compare ordered.
Definition Concepts.hpp:154