From a6ab5fc135c9d5f2d7020ce5432b0204e91c60b9 Mon Sep 17 00:00:00 2001 From: Kunal Arora Date: Mon, 14 Mar 2016 20:33:11 +0530 Subject: [PATCH] added RangeFill.h,rangeFill in Core.h and RangeFill_unittest --- .../internal/implementation/RangeFill.h | 105 ++++++++++++++++++ .../linalg/internal/modules/Core.h | 22 ++++ .../mathematics/linalg/RangeFill_unittest.cc | 80 +++++++++++++ 3 files changed, 207 insertions(+) create mode 100644 src/shogun/mathematics/linalg/internal/implementation/RangeFill.h create mode 100644 tests/unit/mathematics/linalg/RangeFill_unittest.cc diff --git a/src/shogun/mathematics/linalg/internal/implementation/RangeFill.h b/src/shogun/mathematics/linalg/internal/implementation/RangeFill.h new file mode 100644 index 00000000000..28b07e56476 --- /dev/null +++ b/src/shogun/mathematics/linalg/internal/implementation/RangeFill.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) The Shogun Machine Learning Toolbox + * Written (w) 2016 Kunal Arora + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the Shogun Development Team. + */ + +#ifndef RANGE_FILL_IMPL_H_ +#define RANGE_FILL_IMPL_H_ + +#include +#include +#include + +#include + +namespace shogun +{ + +namespace linalg +{ + +namespace implementation +{ + +/** + * @brief Generic class which is specialized for different backends to perform the Range fill operation + */ +template +struct range_fill +{ + /**Scalar type */ + typedef typename Matrix::Scalar T; + + /**Range fill a vector with start...start+len-1 + * @param A - the matrix to be filled + * @param start - value to be assigned to first element of vector + */ + static void compute(Matrix A, T start); + +}; + +/** + * @brief Partial specialization of add for the Eigen3 backend + */ +template +struct range_fill +{ + /** Scalar type */ + typedef typename Matrix::Scalar T; + + /** Eigen3 vector type */ + typedef Eigen::Matrix VectorXt; + + /**Range fill a vector with start...start+len-1 + * @param A - the vector to be filled + * @param start - value to be assigned to first element of vector or matrix + */ + static void compute(SGVector A, T start) + { + compute(A, A.size(), start); + } + + /** Range fill a vector array with start...start+len-1 + * @param A - the array to be filled + * @param len - length of the array to be filled + * @param start - value to be assigned to first element of array + */ + static void compute(SGVector A, index_t len, T start) + { + Eigen::Map A_eig=A; + A_eig.setLinSpaced(len, start, A.size()+start-1); + } + +}; + +} + +} + +} +#endif //RANGE_FILL_IMPL_H_ diff --git a/src/shogun/mathematics/linalg/internal/modules/Core.h b/src/shogun/mathematics/linalg/internal/modules/Core.h index b399347e9bd..3485cdb2053 100644 --- a/src/shogun/mathematics/linalg/internal/modules/Core.h +++ b/src/shogun/mathematics/linalg/internal/modules/Core.h @@ -39,6 +39,7 @@ #include #include #include +#include namespace shogun { @@ -102,6 +103,27 @@ void scale(Matrix A, typename Matrix::Scalar alpha) implementation::scale::compute(A, A, alpha); } +/** Range fill a vector with start...start+len-1 + * @param A - the matrix to be filled + * @param start - value to be assigned to first element of vector or matrix + */ +template ::backend, class Matrix> +void range_fill(Matrix A, typename Matrix::Scalar start=0.0) +{ + implementation::range_fill::compute(A, start); +} + +/** Range fill a vector array with start...start+len-1 + * @param A - the array to be filled + * @param len - length of the array to be filled + * @param start - value to be assigned to first element of array + */ +template ::backend, class Matrix> +void range_fill(Matrix A, index_t len, typename Matrix::Scalar start=0.0) +{ + implementation::range_fill::compute(A, len, start); +} + #ifdef HAVE_LINALG_LIB /** Performs the operation of matrix applied to a vector \f$x = Ab\f$. * diff --git a/tests/unit/mathematics/linalg/RangeFill_unittest.cc b/tests/unit/mathematics/linalg/RangeFill_unittest.cc new file mode 100644 index 00000000000..3eab84fb1f4 --- /dev/null +++ b/tests/unit/mathematics/linalg/RangeFill_unittest.cc @@ -0,0 +1,80 @@ +/* + * Copyright (c) The Shogun Machine Learning Toolbox + * Written (w) 2016 Kunal Arora + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the Shogun Development Team. + */ + +#include + +#ifdef HAVE_LINALG_LIB +#include +#include +#include +#include + +using namespace shogun; + +//test when start=0.0 +TEST(RangeFillVector, eigen3_backend_start0) +{ + SGVector v(4); + linalg::range_fill(v,0.0); + EXPECT_EQ(v.vlen, 4); + for(int32_t i=0;i<4;i++) + EXPECT_NEAR(v[i], i, 1e-9); +} + +//test when start not given as input +TEST(RangeFillVector, eigen3_backend_no_start) +{ + SGVector v(4); + linalg::range_fill(v); + EXPECT_EQ(v.vlen, 4); + for(int32_t i=0;i<4;i++) + EXPECT_NEAR(v[i], i, 1e-9); +} +//test when start>0 +TEST(RangeFillVector, eigen3_backend_start_greaterThan_0) +{ + SGVector v(4); + linalg::range_fill(v,5.0); + EXPECT_EQ(v.vlen, 4); + for(int32_t i=0;i<4;i++) + EXPECT_NEAR(v[i], i+5.0, 1e-9); +} + +//test for negative values +TEST(RangeFillVector, eigen3_backend_start_lessThan_0) +{ + SGVector v(4); + linalg::range_fill(v,-5.0); + EXPECT_EQ(v.vlen, 4); + for(int32_t i=0;i<4;i++) + EXPECT_NEAR(v[i], i-5.0, 1e-9); +} + +#endif // defined(HAVE_LINALG_LIB)