30 std::array<std::size_t, N> shape{};
31 std::size_t total = 1;
32 for (std::size_t k = 0; k < N; ++k) {
33 if (a.dim(k) != b.dim(k)) {
42 std::array<std::size_t, N> idx{};
43 for (std::size_t flat = 0; flat < total; ++flat) {
44 const bool equal = [&]<std::size_t... Ks>(std::index_sequence<Ks...>) {
45 return a(idx[Ks]...) == b(idx[Ks]...);
46 }(std::make_index_sequence<N>{});
50 for (std::size_t k = N; k-- > 0;) {
51 if (++idx[k] < shape[k]) {
79 T atol = T(1e-8)) noexcept {
80 std::array<std::size_t, N> shape{};
81 std::size_t total = 1;
82 for (std::size_t k = 0; k < N; ++k) {
83 if (a.
dim(k) != b.
dim(k)) {
92 std::array<std::size_t, N> idx{};
93 for (std::size_t flat = 0; flat < total; ++flat) {
94 auto [va, vb] = [&]<std::size_t... Ks>(std::index_sequence<Ks...>) {
95 return std::pair<T, T>{a(idx[Ks]...), b(idx[Ks]...)};
96 }(std::make_index_sequence<N>{});
97 const T diff = std::fabs(va - vb);
98 const T tol = atol + (rtol * std::fabs(vb));
102 for (std::size_t k = N; k-- > 0;) {
103 if (++idx[k] < shape[k]) {
bool allClose(const NDArray< T, N, LA > &a, const NDArray< T, N, LB > &b, T rtol=T(1e-5), T atol=T(1e-8)) noexcept
Element-wise approximate equality with NumPy-style asymmetric tolerance.
bool arrayEqual(const NDArray< T, N, LA > &a, const NDArray< T, N, LB > &b) noexcept
Element-wise exact equality between two NDArrays of matching shape.