1 /* 2 * Copyright (c) 2017 Arm Limited. 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all 14 * copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 #ifndef ARM_COMPUTE_TEST_SCALE_LAYER_DATASET 25 #define ARM_COMPUTE_TEST_SCALE_LAYER_DATASET 26 27 #include "utils/TypePrinter.h" 28 29 #include "arm_compute/core/TensorShape.h" 30 #include "arm_compute/core/Types.h" 31 32 namespace arm_compute 33 { 34 namespace test 35 { 36 namespace datasets 37 { 38 class ScaleLayerDataset 39 { 40 public: 41 using type = std::tuple<TensorShape, InterpolationPolicy, BorderMode, SamplingPolicy, float, float>; 42 43 struct iterator 44 { iteratoriterator45 iterator(std::vector<TensorShape>::const_iterator src_it, 46 std::vector<InterpolationPolicy>::const_iterator policy_it, 47 std::vector<BorderMode>::const_iterator border_mode_it, 48 std::vector<SamplingPolicy>::const_iterator sampling_policy_it, 49 std::vector<float>::const_iterator scale_x_it, 50 std::vector<float>::const_iterator scale_y_it) 51 : _src_it{ std::move(src_it) }, 52 _policy_it{ std::move(policy_it) }, 53 _border_mode_it{ std::move(border_mode_it) }, 54 _sampling_policy_it{ std::move(sampling_policy_it) }, 55 _scale_x_it{ std::move(scale_x_it) }, 56 _scale_y_it{ std::move(scale_y_it) } 57 { 58 } 59 descriptioniterator60 std::string description() const 61 { 62 std::stringstream description; 63 description << "In=" << *_src_it << ":"; 64 description << "InterpolationPolicy=" << *_policy_it << ":"; 65 description << "BorderMode=" << *_border_mode_it << ":"; 66 description << "SamplingPolicy=" << *_sampling_policy_it << ":"; 67 description << "Scale_x=" << *_scale_x_it << ":"; 68 description << "Scale_y=" << *_scale_y_it; 69 return description.str(); 70 } 71 72 ScaleLayerDataset::type operator*() const 73 { 74 return std::make_tuple(*_src_it, *_policy_it, *_border_mode_it, *_sampling_policy_it, *_scale_x_it, *_scale_y_it); 75 } 76 77 iterator &operator++() 78 { 79 ++_src_it; 80 ++_policy_it; 81 ++_border_mode_it; 82 ++_sampling_policy_it; 83 ++_scale_x_it; 84 ++_scale_y_it; 85 86 return *this; 87 } 88 89 private: 90 std::vector<TensorShape>::const_iterator _src_it; 91 std::vector<InterpolationPolicy>::const_iterator _policy_it; 92 std::vector<BorderMode>::const_iterator _border_mode_it; 93 std::vector<SamplingPolicy>::const_iterator _sampling_policy_it; 94 std::vector<float>::const_iterator _scale_x_it; 95 std::vector<float>::const_iterator _scale_y_it; 96 }; 97 begin()98 iterator begin() const 99 { 100 return iterator(_src_shapes.begin(), _policy.begin(), _border_mode.begin(), _sampling_policy.begin(), _scale_x.begin(), _scale_y.begin()); 101 } 102 size()103 int size() const 104 { 105 return std::min(_src_shapes.size(), std::min(_policy.size(), std::min(_border_mode.size(), std::min(_sampling_policy.size(), std::min(_scale_x.size(), _scale_y.size()))))); 106 } 107 add_config(TensorShape src,InterpolationPolicy policy,BorderMode border_mode,SamplingPolicy sampling_policy,float scale_x,float scale_y)108 void add_config(TensorShape src, InterpolationPolicy policy, BorderMode border_mode, SamplingPolicy sampling_policy, float scale_x, float scale_y) 109 { 110 _src_shapes.emplace_back(std::move(src)); 111 _policy.emplace_back(std::move(policy)); 112 _border_mode.emplace_back(std::move(border_mode)); 113 _sampling_policy.emplace_back(std::move(sampling_policy)); 114 _scale_x.emplace_back(std::move(scale_x)); 115 _scale_y.emplace_back(std::move(scale_y)); 116 } 117 118 protected: 119 ScaleLayerDataset() = default; 120 ScaleLayerDataset(ScaleLayerDataset &&) = default; 121 122 private: 123 std::vector<TensorShape> _src_shapes{}; 124 std::vector<InterpolationPolicy> _policy{}; 125 std::vector<BorderMode> _border_mode{}; 126 std::vector<SamplingPolicy> _sampling_policy{}; 127 std::vector<float> _scale_x{}; 128 std::vector<float> _scale_y{}; 129 }; 130 131 /** Data set containing small scale layer shapes. */ 132 class SmallScaleLayerShapes final : public ScaleLayerDataset 133 { 134 public: SmallScaleLayerShapes()135 SmallScaleLayerShapes() 136 { 137 add_config(TensorShape(128U, 64U, 1U, 3U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 5, 5); 138 add_config(TensorShape(9U, 9U, 3U, 4U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 7, 7); 139 add_config(TensorShape(27U, 13U, 2U, 4U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 9, 9); 140 } 141 }; 142 143 /** Data set containing large scale layer shapes. */ 144 class LargeScaleLayerShapes final : public ScaleLayerDataset 145 { 146 public: LargeScaleLayerShapes()147 LargeScaleLayerShapes() 148 { 149 add_config(TensorShape(1920U, 1080U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 0.5, 0.5); 150 add_config(TensorShape(640U, 480U, 2U, 3U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 0.5, 0.5); 151 add_config(TensorShape(4160U, 3120U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 0.5, 0.5); 152 add_config(TensorShape(800U, 600U, 1U, 4U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 0.5, 0.5); 153 154 add_config(TensorShape(1920U, 1080U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 2, 2); 155 add_config(TensorShape(640U, 480U, 2U, 3U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 2, 2); 156 add_config(TensorShape(4160U, 3120U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 2, 2); 157 add_config(TensorShape(800U, 600U, 1U, 4U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 2, 2); 158 159 add_config(TensorShape(1920U, 1080U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 3, 3); 160 add_config(TensorShape(640U, 480U, 2U, 3U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 3, 3); 161 add_config(TensorShape(4160U, 3120U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 3, 3); 162 add_config(TensorShape(800U, 600U, 1U, 4U), InterpolationPolicy::NEAREST_NEIGHBOR, BorderMode::UNDEFINED, SamplingPolicy::CENTER, 3, 3); 163 } 164 }; 165 166 } // namespace datasets 167 } // namespace test 168 } // namespace arm_compute 169 #endif /* ARM_COMPUTE_TEST_SCALE_LAYER_DATASET */ 170