From 69af6cf5ec6edce564dd5ef97baba5a1325e8763 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Wed, 14 Feb 2018 19:23:44 +0000 Subject: COMPMID-765: Sanitize permutation vector for Permute. If permutation vector is bigger than the tensorshape to permute then infer dimensions of size one for the extra dimensions. Change-Id: I5addb292f770d925f47f756902e16073039e8f71 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/120473 Tested-by: Jenkins Reviewed-by: Stefana Simion Reviewed-by: Anthony Barbier --- arm_compute/core/Helpers.h | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'arm_compute/core/Helpers.h') diff --git a/arm_compute/core/Helpers.h b/arm_compute/core/Helpers.h index c6a7db4f96..63fad1dcea 100644 --- a/arm_compute/core/Helpers.h +++ b/arm_compute/core/Helpers.h @@ -508,10 +508,28 @@ inline Strides compute_strides(const ITensorInfo &info) template inline void permute(Dimensions &dimensions, const PermutationVector &perm) { - auto copy_dimensions = utility::make_array::num_max_dimensions>(dimensions.begin(), dimensions.end()); + auto dimensions_copy = utility::make_array::num_max_dimensions>(dimensions.begin(), dimensions.end()); for(unsigned int i = 0; i < perm.num_dimensions(); ++i) { - dimensions[i] = copy_dimensions[perm[i]]; + T dimension_val = (perm[i] < dimensions.num_dimensions()) ? dimensions_copy[perm[i]] : 0; + dimensions.set(i, dimension_val); + } +} + +/** Permutes given TensorShape according to a permutation vector + * + * @warning Validity of permutation is not checked + * + * @param[in, out] shape Shape to permute + * @param[in] perm Permutation vector + */ +inline void permute(TensorShape &shape, const PermutationVector &perm) +{ + auto shape_copy = utility::make_array(shape.begin(), shape.end()); + for(unsigned int i = 0; i < perm.num_dimensions(); ++i) + { + size_t dimension_val = (perm[i] < shape.num_dimensions()) ? shape_copy[perm[i]] : 1; + shape.set(i, dimension_val); } } -- cgit v1.2.1