Functions
timings-eigen.cpp File Reference
#include "pinocchio/macros.hpp"
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/StdVector>
#include <benchmark/benchmark.h>
Include dependency graph for timings-eigen.cpp:

Go to the source code of this file.

Functions

 Apply (CustomArgumentsDynamicMatrix)
 
 Apply (CustomArgumentsDynamicMatrixTranspose)
 
 BENCHMARK (matrixDynamicMultVector) -> Apply(CustomArguments) ->Arg(3) ->Arg(4)
 
 BENCHMARK (matrixMultMatrix< 3, ColMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, ColMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, ColMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, ColMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, RowMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, RowMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, RowMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 3, RowMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, ColMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, ColMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, ColMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, ColMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, RowMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, RowMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, RowMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 4, RowMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, ColMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, ColMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, ColMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, ColMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, RowMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, RowMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, RowMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultMatrix< 50, RowMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultVector< 3 >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixMultVector< 4 >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, ColMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, ColMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, ColMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, ColMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, RowMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, RowMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, RowMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 4, RowMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, ColMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, ColMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, ColMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, ColMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, RowMajor, ColMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, RowMajor, ColMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, RowMajor, RowMajor, ColMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (matrixTransposeMultMatrix< 50, RowMajor, RowMajor, RowMajor >) -> Apply(CustomArguments)
 
 BENCHMARK (quaternionMultQuaternion) -> Apply(CustomArguments)
 
 BENCHMARK (quaternionMultVector) -> Apply(CustomArguments)
 
 BENCHMARK (quaternionMultVectorX) -> Apply(CustomArguments)
 
 BENCHMARK (quaternionToMatrix) -> Apply(CustomArguments)
 
 BENCHMARK_MAIN ()
 
static void CustomArguments (benchmark::internal::Benchmark *b)
 
static void CustomArgumentsDynamicMatrix (benchmark::internal::Benchmark *b)
 
static void CustomArgumentsDynamicMatrixTranspose (benchmark::internal::Benchmark *b)
 
template<int OptionM1, int OptionM2, int OptionM3>
static void matrixDynamicMultMatrix (benchmark::State &st)
 
template<int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixDynamicMultMatrixCall (const Matrix< double, Dynamic, Dynamic, OptionM1 > &m, const Matrix< double, Dynamic, Dynamic, OptionM2 > &rhs, Matrix< double, Dynamic, Dynamic, OptionM3 > &lhs)
 
static void matrixDynamicMultVector (benchmark::State &st)
 
PINOCCHIO_DONT_INLINE void matrixDynamicMultVectorCall (const MatrixXd &m, const MatrixXd &rhs, MatrixXd &lhs)
 
template<int OptionM1, int OptionM2, int OptionM3>
static void matrixDynamicTransposeMultMatrix (benchmark::State &st)
 
template<int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixDynamicTransposeMultMatrixCall (const Matrix< double, Dynamic, Dynamic, OptionM1 > &m, const Matrix< double, Dynamic, Dynamic, OptionM2 > &rhs, Matrix< double, Dynamic, Dynamic, OptionM3 > &lhs)
 
template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
static void matrixMultMatrix (benchmark::State &st)
 
template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixMultMatrixCall (const Matrix< double, MSIZE, MSIZE, OptionM1 > &m, const Matrix< double, MSIZE, MSIZE, OptionM2 > &rhs, Matrix< double, MSIZE, MSIZE, OptionM3 > &lhs)
 
template<int MSIZE>
static void matrixMultVector (benchmark::State &st)
 
template<int MSIZE>
PINOCCHIO_DONT_INLINE void matrixMultVectorCall (const Matrix< double, MSIZE, MSIZE > &m, const Matrix< double, MSIZE, 1 > &rhs, Matrix< double, MSIZE, 1 > &lhs)
 
template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
static void matrixTransposeMultMatrix (benchmark::State &st)
 
template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixTransposeMultMatrixCall (const Matrix< double, MSIZE, MSIZE, OptionM1 > &m, const Matrix< double, MSIZE, MSIZE, OptionM2 > &rhs, Matrix< double, MSIZE, MSIZE, OptionM3 > &lhs)
 
static void quaternionMultQuaternion (benchmark::State &st)
 
PINOCCHIO_DONT_INLINE void quaternionMultQuaternionCall (const Quaterniond &q, const Quaterniond &rhs, Quaterniond &lhs)
 
static void quaternionMultVector (benchmark::State &st)
 
PINOCCHIO_DONT_INLINE void quaternionMultVectorCall (const Quaterniond &q, const Vector3d &rhs, Vector3d &lhs)
 
static void quaternionMultVectorX (benchmark::State &st)
 
PINOCCHIO_DONT_INLINE void quaternionMultVectorXCall (const Quaterniond &q, const VectorXd &rhs, VectorXd &lhs)
 
static void quaternionToMatrix (benchmark::State &st)
 
PINOCCHIO_DONT_INLINE void quaternionToMatrixCall (const Quaterniond &q, Matrix3d &m)
 

Function Documentation

◆ Apply() [1/2]

◆ Apply() [2/2]

◆ BENCHMARK() [1/47]

BENCHMARK ( matrixDynamicMultVector  ) -> Apply(CustomArguments) ->Arg(3) ->Arg(4)

◆ BENCHMARK() [2/47]

BENCHMARK ( matrixMultMatrix< 3, ColMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [3/47]

BENCHMARK ( matrixMultMatrix< 3, ColMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [4/47]

BENCHMARK ( matrixMultMatrix< 3, ColMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [5/47]

BENCHMARK ( matrixMultMatrix< 3, ColMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [6/47]

BENCHMARK ( matrixMultMatrix< 3, RowMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [7/47]

BENCHMARK ( matrixMultMatrix< 3, RowMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [8/47]

BENCHMARK ( matrixMultMatrix< 3, RowMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [9/47]

BENCHMARK ( matrixMultMatrix< 3, RowMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [10/47]

BENCHMARK ( matrixMultMatrix< 4, ColMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [11/47]

BENCHMARK ( matrixMultMatrix< 4, ColMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [12/47]

BENCHMARK ( matrixMultMatrix< 4, ColMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [13/47]

BENCHMARK ( matrixMultMatrix< 4, ColMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [14/47]

BENCHMARK ( matrixMultMatrix< 4, RowMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [15/47]

BENCHMARK ( matrixMultMatrix< 4, RowMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [16/47]

BENCHMARK ( matrixMultMatrix< 4, RowMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [17/47]

BENCHMARK ( matrixMultMatrix< 4, RowMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [18/47]

BENCHMARK ( matrixMultMatrix< 50, ColMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [19/47]

BENCHMARK ( matrixMultMatrix< 50, ColMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [20/47]

BENCHMARK ( matrixMultMatrix< 50, ColMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [21/47]

BENCHMARK ( matrixMultMatrix< 50, ColMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [22/47]

BENCHMARK ( matrixMultMatrix< 50, RowMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [23/47]

BENCHMARK ( matrixMultMatrix< 50, RowMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [24/47]

BENCHMARK ( matrixMultMatrix< 50, RowMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [25/47]

BENCHMARK ( matrixMultMatrix< 50, RowMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [26/47]

BENCHMARK ( matrixMultVector< 3 >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [27/47]

BENCHMARK ( matrixMultVector< 4 >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [28/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, ColMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [29/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, ColMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [30/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, ColMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [31/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, ColMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [32/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, RowMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [33/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, RowMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [34/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, RowMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [35/47]

BENCHMARK ( matrixTransposeMultMatrix< 4, RowMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [36/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, ColMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [37/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, ColMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [38/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, ColMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [39/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, ColMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [40/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, RowMajor, ColMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [41/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, RowMajor, ColMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [42/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, RowMajor, RowMajor, ColMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [43/47]

BENCHMARK ( matrixTransposeMultMatrix< 50, RowMajor, RowMajor, RowMajor >  ) -> Apply(CustomArguments)

◆ BENCHMARK() [44/47]

◆ BENCHMARK() [45/47]

◆ BENCHMARK() [46/47]

◆ BENCHMARK() [47/47]

◆ BENCHMARK_MAIN()

BENCHMARK_MAIN ( )

◆ CustomArguments()

static void CustomArguments ( benchmark::internal::Benchmark *  b)
static

Definition at line 15 of file timings-eigen.cpp.

◆ CustomArgumentsDynamicMatrix()

static void CustomArgumentsDynamicMatrix ( benchmark::internal::Benchmark *  b)
static

Definition at line 210 of file timings-eigen.cpp.

◆ CustomArgumentsDynamicMatrixTranspose()

static void CustomArgumentsDynamicMatrixTranspose ( benchmark::internal::Benchmark *  b)
static

Definition at line 258 of file timings-eigen.cpp.

◆ matrixDynamicMultMatrix()

template<int OptionM1, int OptionM2, int OptionM3>
static void matrixDynamicMultMatrix ( benchmark::State &  st)
static

Definition at line 224 of file timings-eigen.cpp.

◆ matrixDynamicMultMatrixCall()

template<int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixDynamicMultMatrixCall ( const Matrix< double, Dynamic, Dynamic, OptionM1 > &  m,
const Matrix< double, Dynamic, Dynamic, OptionM2 > &  rhs,
Matrix< double, Dynamic, Dynamic, OptionM3 > &  lhs 
)

Definition at line 216 of file timings-eigen.cpp.

◆ matrixDynamicMultVector()

static void matrixDynamicMultVector ( benchmark::State &  st)
static

Definition at line 311 of file timings-eigen.cpp.

◆ matrixDynamicMultVectorCall()

PINOCCHIO_DONT_INLINE void matrixDynamicMultVectorCall ( const MatrixXd &  m,
const MatrixXd &  rhs,
MatrixXd &  lhs 
)

Definition at line 307 of file timings-eigen.cpp.

◆ matrixDynamicTransposeMultMatrix()

template<int OptionM1, int OptionM2, int OptionM3>
static void matrixDynamicTransposeMultMatrix ( benchmark::State &  st)
static

Definition at line 272 of file timings-eigen.cpp.

◆ matrixDynamicTransposeMultMatrixCall()

template<int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixDynamicTransposeMultMatrixCall ( const Matrix< double, Dynamic, Dynamic, OptionM1 > &  m,
const Matrix< double, Dynamic, Dynamic, OptionM2 > &  rhs,
Matrix< double, Dynamic, Dynamic, OptionM3 > &  lhs 
)

Definition at line 264 of file timings-eigen.cpp.

◆ matrixMultMatrix()

template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
static void matrixMultMatrix ( benchmark::State &  st)
static

Definition at line 108 of file timings-eigen.cpp.

◆ matrixMultMatrixCall()

template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixMultMatrixCall ( const Matrix< double, MSIZE, MSIZE, OptionM1 > &  m,
const Matrix< double, MSIZE, MSIZE, OptionM2 > &  rhs,
Matrix< double, MSIZE, MSIZE, OptionM3 > &  lhs 
)

Definition at line 100 of file timings-eigen.cpp.

◆ matrixMultVector()

template<int MSIZE>
static void matrixMultVector ( benchmark::State &  st)
static

Definition at line 194 of file timings-eigen.cpp.

◆ matrixMultVectorCall()

template<int MSIZE>
PINOCCHIO_DONT_INLINE void matrixMultVectorCall ( const Matrix< double, MSIZE, MSIZE > &  m,
const Matrix< double, MSIZE, 1 > &  rhs,
Matrix< double, MSIZE, 1 > &  lhs 
)

Definition at line 186 of file timings-eigen.cpp.

◆ matrixTransposeMultMatrix()

template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
static void matrixTransposeMultMatrix ( benchmark::State &  st)
static

Definition at line 155 of file timings-eigen.cpp.

◆ matrixTransposeMultMatrixCall()

template<int MSIZE, int OptionM1, int OptionM2, int OptionM3>
PINOCCHIO_DONT_INLINE void matrixTransposeMultMatrixCall ( const Matrix< double, MSIZE, MSIZE, OptionM1 > &  m,
const Matrix< double, MSIZE, MSIZE, OptionM2 > &  rhs,
Matrix< double, MSIZE, MSIZE, OptionM3 > &  lhs 
)

Definition at line 147 of file timings-eigen.cpp.

◆ quaternionMultQuaternion()

static void quaternionMultQuaternion ( benchmark::State &  st)
static

Definition at line 65 of file timings-eigen.cpp.

◆ quaternionMultQuaternionCall()

PINOCCHIO_DONT_INLINE void quaternionMultQuaternionCall ( const Quaterniond &  q,
const Quaterniond &  rhs,
Quaterniond &  lhs 
)

Definition at line 61 of file timings-eigen.cpp.

◆ quaternionMultVector()

static void quaternionMultVector ( benchmark::State &  st)
static

Definition at line 45 of file timings-eigen.cpp.

◆ quaternionMultVectorCall()

PINOCCHIO_DONT_INLINE void quaternionMultVectorCall ( const Quaterniond &  q,
const Vector3d &  rhs,
Vector3d &  lhs 
)

Definition at line 41 of file timings-eigen.cpp.

◆ quaternionMultVectorX()

static void quaternionMultVectorX ( benchmark::State &  st)
static

Definition at line 85 of file timings-eigen.cpp.

◆ quaternionMultVectorXCall()

PINOCCHIO_DONT_INLINE void quaternionMultVectorXCall ( const Quaterniond &  q,
const VectorXd &  rhs,
VectorXd &  lhs 
)

Definition at line 81 of file timings-eigen.cpp.

◆ quaternionToMatrix()

static void quaternionToMatrix ( benchmark::State &  st)
static

Definition at line 26 of file timings-eigen.cpp.

◆ quaternionToMatrixCall()

PINOCCHIO_DONT_INLINE void quaternionToMatrixCall ( const Quaterniond &  q,
Matrix3d &  m 
)

Definition at line 22 of file timings-eigen.cpp.



pinocchio
Author(s):
autogenerated on Wed Apr 16 2025 02:41:53