MCPcopy Create free account
hub / github.com/ARM-software/ComputeLibrary / calculate_valid_region_scale

Function calculate_valid_region_scale

src/core/Helpers.cpp:28–105  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

26namespace arm_compute
27{
28ValidRegion calculate_valid_region_scale(const ITensorInfo &src_info,
29 const TensorShape &dst_shape,
30 InterpolationPolicy interpolate_policy,
31 SamplingPolicy sampling_policy,
32 bool border_undefined)
33{
34 const DataLayout data_layout = src_info.data_layout();
35 const int idx_width = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH);
36 const int idx_height = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT);
37
38 const float scale_x = static_cast<float>(dst_shape[idx_width]) / src_info.tensor_shape()[idx_width];
39 const float scale_y = static_cast<float>(dst_shape[idx_height]) / src_info.tensor_shape()[idx_height];
40 const float sampling_point = (sampling_policy == SamplingPolicy::CENTER) ? 0.5f : 0.0f;
41
42 // Get input's valid region start and end points
43 const int valid_start_in_x = src_info.valid_region().anchor[idx_width];
44 const int valid_start_in_y = src_info.valid_region().anchor[idx_height];
45 const int valid_end_in_x = src_info.valid_region().anchor[idx_width] + src_info.valid_region().shape[idx_width];
46 const int valid_end_in_y = src_info.valid_region().anchor[idx_height] + src_info.valid_region().shape[idx_height];
47
48 // Initialize output's valid region start and end points
49 auto valid_start_out_x = static_cast<int>(valid_start_in_x * scale_x);
50 auto valid_start_out_y = static_cast<int>(valid_start_in_y * scale_y);
51 auto valid_end_out_x = std::min<int>(std::ceil(valid_end_in_x * scale_x), dst_shape[idx_width]);
52 auto valid_end_out_y = std::min<int>(std::ceil(valid_end_in_y * scale_y), dst_shape[idx_height]);
53
54 // Handle valid points in case of the bi-linear interpolation
55 if (border_undefined)
56 {
57 switch (interpolate_policy)
58 {
59 case InterpolationPolicy::NEAREST_NEIGHBOR:
60 {
61 // (start_out + sampling_point) >= (start_in * scale)
62 // start_out = ceil((start_in * scale) - sampling_point)
63 valid_start_out_x = std::ceil(valid_start_in_x * scale_x - sampling_point);
64 valid_start_out_y = std::ceil(valid_start_in_y * scale_y - sampling_point);
65
66 // (end_out - 1 + sampling_point) < (end_in * scale)
67 // end_out = ceil((end_in * scale) - sampling_point); // <-- ceil(x - 1) strictly less
68 valid_end_out_x = std::ceil(valid_end_in_x * scale_x - sampling_point);
69 valid_end_out_y = std::ceil(valid_end_in_y * scale_y - sampling_point);
70 break;
71 }
72 case InterpolationPolicy::BILINEAR:
73 {
74 // (start_out + sampling_point) >= ((start_in + sampling_point) * scale)
75 // start_out = ceil(((start_in + sampling_point) * scale) - sampling_point)
76 valid_start_out_x = std::ceil((valid_start_in_x + sampling_point) * scale_x - sampling_point);
77 valid_start_out_y = std::ceil((valid_start_in_y + sampling_point) * scale_y - sampling_point);
78
79 // (end_out - 1 + sampling_point) <= ((end_in - 1 + sampling_point) * scale)
80 // end_out = floor(((end_in - 1 + sampling_point) * scale) - sampling_point + 1)
81 valid_end_out_x = std::floor((valid_end_in_x - 1.f + sampling_point) * scale_x - sampling_point + 1.f);
82 valid_end_out_y = std::floor((valid_end_in_y - 1.f + sampling_point) * scale_y - sampling_point + 1.f);
83 break;
84 }
85 case InterpolationPolicy::AREA:

Callers 2

FIXTURE_DATA_TEST_CASEFunction · 0.85
FIXTURE_DATA_TEST_CASEFunction · 0.85

Calls 7

ceilFunction · 0.85
floorFunction · 0.85
CoordinatesClass · 0.50
data_layoutMethod · 0.45
valid_regionMethod · 0.45
num_dimensionsMethod · 0.45
setMethod · 0.45

Tested by

no test coverage detected