| 593 | // Returns the result of a 4D pad on an input array. |
| 594 | template <typename NativeT> |
| 595 | static Array4D<NativeT> PadArray4D(const Array4D<NativeT>& operand, |
| 596 | const PaddingConfig& padding, |
| 597 | const NativeT pad) { |
| 598 | CHECK_EQ(padding.dimensions_size(), 4); |
| 599 | |
| 600 | const int64 input_bounds[] = {operand.n1(), operand.n2(), operand.n3(), |
| 601 | operand.n4()}; |
| 602 | int64 pad_low[4]; |
| 603 | int64 pad_high[4]; |
| 604 | int64 pad_interior[4]; |
| 605 | int64 output_bounds[4]; |
| 606 | for (int64 i = 0; i < 4; ++i) { |
| 607 | pad_low[i] = padding.dimensions(i).edge_padding_low(); |
| 608 | pad_high[i] = padding.dimensions(i).edge_padding_high(); |
| 609 | CHECK_LE(0, padding.dimensions(i).interior_padding()) |
| 610 | << "not implemented"; |
| 611 | pad_interior[i] = padding.dimensions(i).interior_padding(); |
| 612 | |
| 613 | output_bounds[i] = pad_low[i] + input_bounds[i] + pad_high[i] + |
| 614 | (input_bounds[i] - 1) * pad_interior[i]; |
| 615 | } |
| 616 | |
| 617 | Array4D<NativeT> result(output_bounds[0], output_bounds[1], |
| 618 | output_bounds[2], output_bounds[3]); |
| 619 | result.Each( |
| 620 | [&](absl::Span<const int64> indices, NativeT* value) { |
| 621 | for (int i = 0; i < 4; ++i) { |
| 622 | bool in_low_padding = indices[i] < pad_low[i]; |
| 623 | bool in_high_padding = indices[i] >= output_bounds[i] - pad_high[i]; |
| 624 | if (in_low_padding || in_high_padding) { |
| 625 | *value = pad; |
| 626 | return; |
| 627 | } |
| 628 | if (pad_interior[i] && |
| 629 | (indices[i] - pad_low[i]) % (pad_interior[i] + 1)) { |
| 630 | *value = pad; |
| 631 | return; |
| 632 | } |
| 633 | } |
| 634 | *value = operand((indices[0] - pad_low[0]) / (pad_interior[0] + 1), |
| 635 | (indices[1] - pad_low[1]) / (pad_interior[1] + 1), |
| 636 | (indices[2] - pad_low[2]) / (pad_interior[2] + 1), |
| 637 | (indices[3] - pad_low[3]) / (pad_interior[3] + 1)); |
| 638 | }); |
| 639 | return result; |
| 640 | } |
| 641 | |
| 642 | // ApplyElementwise2D(f, x, y, ...) returns the Array2D formed by running |
| 643 | // f(x[i], y[i], ...) for each array element in the Array2Ds x, y, .... |
nothing calls this directly
no test coverage detected