[RFC,v2,09/12] ipa: libipa: vector: Add sum() function
diff mbox series

Message ID 20241118000738.18977-10-laurent.pinchart@ideasonboard.com
State New
Headers show
Series
  • Improve linear algebra helpers in libipa
Related show

Commit Message

Laurent Pinchart Nov. 18, 2024, 12:07 a.m. UTC
Add a function to calculate the sum of a vector. It will be useful for
algorithms.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
Changes since v1:

- Drop Vector::normalize()
---
 src/ipa/libipa/vector.cpp | 12 ++++++++++++
 src/ipa/libipa/vector.h   |  7 +++++++
 2 files changed, 19 insertions(+)

Comments

Milan Zamazal Nov. 18, 2024, 1:55 p.m. UTC | #1
Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:

> Add a function to calculate the sum of a vector. It will be useful for
> algorithms.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Milan Zamazal <mzamazal@redhat.com>

> ---
> Changes since v1:
>
> - Drop Vector::normalize()
> ---
>  src/ipa/libipa/vector.cpp | 12 ++++++++++++
>  src/ipa/libipa/vector.h   |  7 +++++++
>  2 files changed, 19 insertions(+)
>
> diff --git a/src/ipa/libipa/vector.cpp b/src/ipa/libipa/vector.cpp
> index 14816cdb5d09..19e7537f8a5a 100644
> --- a/src/ipa/libipa/vector.cpp
> +++ b/src/ipa/libipa/vector.cpp
> @@ -296,6 +296,18 @@ namespace ipa {
>   * \return The length of the vector
>   */
>  
> +/**
> + * \fn Vector::sum() const
> + * \brief Calculate the sum of all the vector elements
> + * \tparam R The type of the sum
> + *
> + * The type R of the sum defaults to the type T of the elements, but can be set
> + * explicitly to use a different type in case the type T would risk
> + * overflowing.
> + *
> + * \return The sum of all the vector elements
> + */
> +
>  /**
>   * \fn Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)
>   * \brief Multiply a matrix by a vector
> diff --git a/src/ipa/libipa/vector.h b/src/ipa/libipa/vector.h
> index 949dc4650aa4..f55da6476103 100644
> --- a/src/ipa/libipa/vector.h
> +++ b/src/ipa/libipa/vector.h
> @@ -9,6 +9,7 @@
>  #include <algorithm>
>  #include <array>
>  #include <cmath>
> +#include <numeric>
>  #include <optional>
>  #include <ostream>
>  
> @@ -245,6 +246,12 @@ public:
>  		return std::sqrt(length2());
>  	}
>  
> +	template<typename R = T>
> +	constexpr R sum() const
> +	{
> +		return std::accumulate(data_.begin(), data_.end(), R{});
> +	}
> +
>  private:
>  	static constexpr Vector apply(const Vector &lhs, const Vector &rhs, std::function<T(T, T)> func)
>  	{

Patch
diff mbox series

diff --git a/src/ipa/libipa/vector.cpp b/src/ipa/libipa/vector.cpp
index 14816cdb5d09..19e7537f8a5a 100644
--- a/src/ipa/libipa/vector.cpp
+++ b/src/ipa/libipa/vector.cpp
@@ -296,6 +296,18 @@  namespace ipa {
  * \return The length of the vector
  */
 
+/**
+ * \fn Vector::sum() const
+ * \brief Calculate the sum of all the vector elements
+ * \tparam R The type of the sum
+ *
+ * The type R of the sum defaults to the type T of the elements, but can be set
+ * explicitly to use a different type in case the type T would risk
+ * overflowing.
+ *
+ * \return The sum of all the vector elements
+ */
+
 /**
  * \fn Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)
  * \brief Multiply a matrix by a vector
diff --git a/src/ipa/libipa/vector.h b/src/ipa/libipa/vector.h
index 949dc4650aa4..f55da6476103 100644
--- a/src/ipa/libipa/vector.h
+++ b/src/ipa/libipa/vector.h
@@ -9,6 +9,7 @@ 
 #include <algorithm>
 #include <array>
 #include <cmath>
+#include <numeric>
 #include <optional>
 #include <ostream>
 
@@ -245,6 +246,12 @@  public:
 		return std::sqrt(length2());
 	}
 
+	template<typename R = T>
+	constexpr R sum() const
+	{
+		return std::accumulate(data_.begin(), data_.end(), R{});
+	}
+
 private:
 	static constexpr Vector apply(const Vector &lhs, const Vector &rhs, std::function<T(T, T)> func)
 	{