Download include/colmap/lib/VLFeat/mathop.h from camenduru/ceres-solver: direct link, hf CLI and curl.
- Browser
- Download file 18.4 kB
-
https://huggingface.co/camenduru/ceres-solver/resolve/main/include/colmap/lib/VLFeat/mathop.h
- Command line
-
hf download hf://camenduru/ceres-solver/include/colmap/lib/VLFeat/mathop.h
-
curl -L -o mathop.h https://huggingface.co/camenduru/ceres-solver/resolve/main/include/colmap/lib/VLFeat/mathop.h
18.4 kB
| /** @file mathop.h | |
| ** @brief Math operations (@ref mathop) | |
| ** @author Andrea Vedaldi, David Novotny | |
| **/ | |
| /* | |
| Copyright (C) 2007-12 Andrea Vedaldi and Brian Fulkerson. | |
| All rights reserved. | |
| This file is part of the VLFeat library and is made available under | |
| the terms of the BSD license (see the COPYING file). | |
| */ | |
| /** @brief Euler constant*/ | |
| /** @brief Logarithm of 2 (math constant)*/ | |
| /** @brief Pi (math constant) */ | |
| /** @brief IEEE single precision epsilon (math constant) | |
| ** | |
| ** <code>1.0F + VL_EPSILON_F</code> is the smallest representable | |
| ** single precision number greater than @c 1.0F. Numerically, | |
| ** ::VL_EPSILON_F is equal to @f$ 2^{-23} @f$. | |
| ** | |
| **/ | |
| /** @brief IEEE double precision epsilon (math constant) | |
| ** | |
| ** <code>1.0 + VL_EPSILON_D</code> is the smallest representable | |
| ** double precision number greater than @c 1.0. Numerically, | |
| ** ::VL_EPSILON_D is equal to @f$ 2^{-52} @f$. | |
| **/ | |
| /* | |
| For the code below: An ANSI C compiler takes the two expressions, | |
| LONG_VAR and CHAR_VAR, and implicitly casts them to the type of the | |
| first member of the union. Refer to K&R Second Edition Page 148, | |
| last paragraph. | |
| */ | |
| /** @internal @brief IEEE single precision quiet NaN constant */ | |
| static union { vl_uint32 raw ; float value ; } | |
| const vl_nan_f = | |
| { 0x7FC00000UL } ; | |
| /** @internal @brief IEEE single precision infinity constant */ | |
| static union { vl_uint32 raw ; float value ; } | |
| const vl_infinity_f = | |
| { 0x7F800000UL } ; | |
| /** @internal @brief IEEE double precision quiet NaN constant */ | |
| static union { vl_uint64 raw ; double value ; } | |
| const vl_nan_d = | |
| { 0x7FF8000000000000ui64 } ; | |
| { 0x7FF8000000000000ULL } ; | |
| /** @internal @brief IEEE double precision infinity constant */ | |
| static union { vl_uint64 raw ; double value ; } | |
| const vl_infinity_d = | |
| { 0x7FF0000000000000ui64 } ; | |
| { 0x7FF0000000000000ULL } ; | |
| /** @brief IEEE single precision NaN (not signaling) */ | |
| /** @brief IEEE single precision positive infinity (not signaling) */ | |
| /** @brief IEEE double precision NaN (not signaling) */ | |
| /** @brief IEEE double precision positive infinity (not signaling) */ | |
| /* ---------------------------------------------------------------- */ | |
| /** @brief Fast <code>mod(x, 2 * VL_PI)</code> | |
| ** | |
| ** @param x input value. | |
| ** @return <code>mod(x, 2 * VL_PI)</code> | |
| ** | |
| ** The function is optimized for small absolute values of @a x. | |
| ** | |
| ** The result is guaranteed to be not smaller than 0. However, due to | |
| ** finite numerical precision and rounding errors, the result can be | |
| ** equal to 2 * VL_PI (for instance, if @c x is a very small negative | |
| ** number). | |
| **/ | |
| VL_INLINE float | |
| vl_mod_2pi_f (float x) | |
| { | |
| while (x > (float)(2 * VL_PI)) x -= (float) (2 * VL_PI) ; | |
| while (x < 0.0F) x += (float) (2 * VL_PI); | |
| return x ; | |
| } | |
| /** @brief Fast <code>mod(x, 2 * VL_PI)</code> | |
| ** @see vl_mod_2pi_f | |
| **/ | |
| VL_INLINE double | |
| vl_mod_2pi_d (double x) | |
| { | |
| while (x > 2.0 * VL_PI) x -= 2 * VL_PI ; | |
| while (x < 0.0) x += 2 * VL_PI ; | |
| return x ; | |
| } | |
| /** @brief Floor and convert to integer | |
| ** @param x argument. | |
| ** @return Similar to @c (int) floor(x) | |
| **/ | |
| VL_INLINE long int | |
| vl_floor_f (float x) | |
| { | |
| long int xi = (long int) x ; | |
| if (x >= 0 || (float) xi == x) return xi ; | |
| else return xi - 1 ; | |
| } | |
| /** @brief Floor and convert to integer | |
| ** @see vl_floor_f | |
| **/ | |
| VL_INLINE long int | |
| vl_floor_d (double x) | |
| { | |
| long int xi = (long int) x ; | |
| if (x >= 0 || (double) xi == x) return xi ; | |
| else return xi - 1 ; | |
| } | |
| /** @brief Ceil and convert to integer | |
| ** @param x argument. | |
| ** @return @c lceilf(x) | |
| **/ | |
| VL_INLINE long int | |
| vl_ceil_f (float x) | |
| { | |
| return (long int) __builtin_ceilf(x) ; | |
| return (long int) ceilf(x) ; | |
| } | |
| /** @brief Ceil and convert to integer | |
| ** @see vl_ceil_f | |
| **/ | |
| VL_INLINE long int | |
| vl_ceil_d (double x) | |
| { | |
| return __builtin_ceil(x) ; | |
| return (long int) ceil(x) ; | |
| } | |
| /** @brief Round | |
| ** @param x argument. | |
| ** @return @c lroundf(x) | |
| ** This function is either the same or similar to C99 @c lroundf(). | |
| **/ | |
| VL_INLINE long int | |
| vl_round_f (float x) | |
| { | |
| return __builtin_lroundf(x) ; | |
| if (x >= 0.0F) { | |
| return vl_floor_f(x + 0.5F) ; | |
| } else { | |
| return vl_ceil_f(x - 0.5F) ; | |
| } | |
| return lroundf(x) ; | |
| } | |
| /** @brief Round | |
| ** @param x argument. | |
| ** @return @c lround(x) | |
| ** This function is either the same or similar to C99 @c lround(). | |
| **/ | |
| VL_INLINE long int | |
| vl_round_d (double x) | |
| { | |
| return __builtin_lround(x) ; | |
| if (x >= 0.0) { | |
| return vl_floor_d(x + 0.5) ; | |
| } else { | |
| return vl_ceil_d(x - 0.5) ; | |
| } | |
| return lround(x) ; | |
| } | |
| /** @brief Fast @c abs(x) | |
| ** @param x argument. | |
| ** @return @c abs(x) | |
| **/ | |
| VL_INLINE float | |
| vl_abs_f (float x) | |
| { | |
| return __builtin_fabsf (x) ; | |
| return fabsf(x) ; | |
| } | |
| /** @brief Fast @c abs(x) | |
| ** @sa vl_abs_f | |
| **/ | |
| VL_INLINE double | |
| vl_abs_d (double x) | |
| { | |
| return __builtin_fabs (x) ; | |
| return fabs(x) ; | |
| } | |
| /** @brief Base-2 logaritghm | |
| ** @param x argument. | |
| ** @return @c log(x). | |
| **/ | |
| VL_INLINE double | |
| vl_log2_d (double x) | |
| { | |
| return __builtin_log2(x) ; | |
| return log(x) / 0.693147180559945 ; | |
| return log2(x) ; | |
| } | |
| /** @copydoc vl_log2_d */ | |
| VL_INLINE float | |
| vl_log2_f (float x) | |
| { | |
| return __builtin_log2f (x) ; | |
| return logf(x) / 0.6931472F ; | |
| return log2(x) ; | |
| } | |
| /** @brief Square root. | |
| ** @param x argument. | |
| ** @return @c sqrt(x). | |
| **/ | |
| VL_INLINE double | |
| vl_sqrt_d (double x) | |
| { | |
| return __builtin_sqrt(x) ; | |
| return sqrt(x) ; | |
| } | |
| /** @copydoc vl_sqrt_d */ | |
| VL_INLINE float | |
| vl_sqrt_f (float x) | |
| { | |
| return __builtin_sqrtf(x) ; | |
| return sqrtf(x) ; | |
| } | |
| /** @brief Check whether a floating point value is NaN | |
| ** @param x argument. | |
| ** @return true if @a x is NaN. | |
| **/ | |
| VL_INLINE vl_bool | |
| vl_is_nan_f (float x) | |
| { | |
| return __builtin_isnan (x) ; | |
| return _isnan(x) ; | |
| return isnan(x) ; | |
| } | |
| /** @copydoc vl_is_nan_f */ | |
| VL_INLINE vl_bool | |
| vl_is_nan_d (double x) | |
| { | |
| return __builtin_isnan (x) ; | |
| return _isnan(x) ; | |
| return isnan(x) ; | |
| } | |
| /** @brief Check whether a floating point value is infinity | |
| ** @param x argument. | |
| ** @return true if @a x is infinity. | |
| **/ | |
| VL_INLINE vl_bool | |
| vl_is_inf_f (float x) | |
| { | |
| return __builtin_isinf (x) ; | |
| return ! _finite(x) ; | |
| return isinf(x) ; | |
| } | |
| /** @copydoc vl_is_inf_f */ | |
| VL_INLINE vl_bool | |
| vl_is_inf_d (double x) | |
| { | |
| return __builtin_isinf (x) ; | |
| return ! _finite(x) ; | |
| return isinf(x) ; | |
| } | |
| /** ------------------------------------------------------------------ | |
| ** @brief Fast @c atan2 approximation | |
| ** @param y argument. | |
| ** @param x argument. | |
| ** | |
| ** The function computes a relatively rough but fast approximation of | |
| ** @c atan2(y,x). | |
| ** | |
| ** @par Algorithm | |
| ** | |
| ** The algorithm approximates the function @f$ f(r)=atan((1-r)/(1+r)) | |
| ** @f$, @f$ r \in [-1,1] @f$ with a third order polynomial @f$ | |
| ** f(r)=c_0 + c_1 r + c_2 r^2 + c_3 r^3 @f$. To fit the polynomial | |
| ** we impose the constraints | |
| ** | |
| ** @f{eqnarray*} | |
| ** f(+1) &=& c_0 + c_1 + c_2 + c_3 = atan(0) = 0,\\ | |
| ** f(-1) &=& c_0 - c_1 + c_2 - c_3 = atan(\infty) = \pi/2,\\ | |
| ** f(0) &=& c_0 = atan(1) = \pi/4. | |
| ** @f} | |
| ** | |
| ** The last degree of freedom is fixed by minimizing the @f$ | |
| ** l^{\infty} @f$ error, which yields | |
| ** | |
| ** @f[ | |
| ** c_0=\pi/4, \quad | |
| ** c_1=-0.9675, \quad | |
| ** c_2=0, \quad | |
| ** c_3=0.1821, | |
| ** @f] | |
| ** | |
| ** with maximum error of 0.0061 radians at 0.35 degrees. | |
| ** | |
| ** @return Approximation of @c atan2(y,x). | |
| **/ | |
| VL_INLINE float | |
| vl_fast_atan2_f (float y, float x) | |
| { | |
| float angle, r ; | |
| float const c3 = 0.1821F ; | |
| float const c1 = 0.9675F ; | |
| float abs_y = vl_abs_f (y) + VL_EPSILON_F ; | |
| if (x >= 0) { | |
| r = (x - abs_y) / (x + abs_y) ; | |
| angle = (float) (VL_PI / 4) ; | |
| } else { | |
| r = (x + abs_y) / (abs_y - x) ; | |
| angle = (float) (3 * VL_PI / 4) ; | |
| } | |
| angle += (c3*r*r - c1) * r ; | |
| return (y < 0) ? - angle : angle ; | |
| } | |
| /** @brief Fast @c atan2 approximation | |
| ** @sa vl_fast_atan2_f | |
| **/ | |
| VL_INLINE double | |
| vl_fast_atan2_d (double y, double x) | |
| { | |
| double angle, r ; | |
| double const c3 = 0.1821 ; | |
| double const c1 = 0.9675 ; | |
| double abs_y = vl_abs_d (y) + VL_EPSILON_D ; | |
| if (x >= 0) { | |
| r = (x - abs_y) / (x + abs_y) ; | |
| angle = VL_PI / 4 ; | |
| } else { | |
| r = (x + abs_y) / (abs_y - x) ; | |
| angle = 3 * VL_PI / 4 ; | |
| } | |
| angle += (c3*r*r - c1) * r ; | |
| return (y < 0) ? - angle : angle ; | |
| } | |
| /** ------------------------------------------------------------------ | |
| ** @brief Fast @c resqrt approximation | |
| ** @param x argument. | |
| ** @return approximation of @c resqrt(x). | |
| ** | |
| ** The function quickly computes an approximation of @f$ x^{-1/2} | |
| ** @f$. | |
| ** | |
| ** @par Algorithm | |
| ** | |
| ** The goal is to compute @f$ y = x^{-1/2} @f$, which we do by | |
| ** finding the solution of @f$ 0 = f(y) = y^{-2} - x @f$ by two Newton | |
| ** steps. Each Newton iteration is given by | |
| ** | |
| ** @f[ | |
| ** y \leftarrow | |
| ** y - \frac{f(y)}{\frac{df(y)}{dy}} = | |
| ** y + \frac{1}{2} (y-xy^3) = | |
| ** \frac{y}{2} \left( 3 - xy^2 \right) | |
| ** @f] | |
| ** | |
| ** which yields a simple polynomial update rule. | |
| ** | |
| ** The clever bit (attributed to either J. Carmack or G. Tarolli) is | |
| ** the way an initial guess @f$ y \approx x^{-1/2} @f$ is chosen. | |
| ** | |
| ** @see <a href="http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf">Inverse Sqare Root</a>. | |
| ** | |
| **/ | |
| VL_INLINE float | |
| vl_fast_resqrt_f (float x) | |
| { | |
| /* 32-bit version */ | |
| union { | |
| float x ; | |
| vl_int32 i ; | |
| } u ; | |
| float xhalf = (float) 0.5 * x ; | |
| /* convert floating point value in RAW integer */ | |
| u.x = x ; | |
| /* gives initial guess y0 */ | |
| u.i = 0x5f3759df - (u.i >> 1); | |
| /*u.i = 0xdf59375f - (u.i>>1);*/ | |
| /* two Newton steps */ | |
| u.x = u.x * ( (float) 1.5 - xhalf*u.x*u.x) ; | |
| u.x = u.x * ( (float) 1.5 - xhalf*u.x*u.x) ; | |
| return u.x ; | |
| } | |
| /** @brief Fast @c resqrt approximation | |
| ** @sa vl_fast_resqrt_d | |
| **/ | |
| VL_INLINE double | |
| vl_fast_resqrt_d (double x) | |
| { | |
| /* 64-bit version */ | |
| union { | |
| double x ; | |
| vl_int64 i ; | |
| } u ; | |
| double xhalf = (double) 0.5 * x ; | |
| /* convert floating point value in RAW integer */ | |
| u.x = x ; | |
| /* gives initial guess y0 */ | |
| u.i = 0x5fe6ec85e7de30dai64 - (u.i >> 1) ; | |
| u.i = 0x5fe6ec85e7de30daLL - (u.i >> 1) ; | |
| /* two Newton steps */ | |
| u.x = u.x * ( (double) 1.5 - xhalf*u.x*u.x) ; | |
| u.x = u.x * ( (double) 1.5 - xhalf*u.x*u.x) ; | |
| return u.x ; | |
| } | |
| /** ------------------------------------------------------------------ | |
| ** @brief Fast @c sqrt approximation | |
| ** @param x argument. | |
| ** @return approximation of @c sqrt(x). | |
| ** | |
| ** The function uses ::vl_fast_resqrt_f | |
| ** (or ::vl_fast_resqrt_d) to compute <code>x * | |
| ** vl_fast_resqrt_f(x)</code>. | |
| **/ | |
| VL_INLINE float | |
| vl_fast_sqrt_f (float x) | |
| { | |
| return (x < 1e-8) ? 0 : x * vl_fast_resqrt_f (x) ; | |
| } | |
| /** @brief Fast @c sqrt approximation | |
| ** @copydoc vl_fast_sqrt_f | |
| **/ | |
| VL_INLINE double | |
| vl_fast_sqrt_d (float x) | |
| { | |
| return (x < 1e-8) ? 0 : x * vl_fast_resqrt_d (x) ; | |
| } | |
| /** @brief Fast integer @c sqrt approximation | |
| ** @param x non-negative integer. | |
| ** @return largest integer $y$ such that $y^2 \leq x$. | |
| ** @sa @ref mathop-sqrti "Algorithm" | |
| **/ | |
| VL_INLINE vl_uint64 vl_fast_sqrt_ui64 (vl_uint64 x) ; | |
| /** @brief Fast @c sqrt approximation | |
| ** @copydoc vl_fast_sqrt_ui64 */ | |
| VL_INLINE vl_uint32 vl_fast_sqrt_ui32 (vl_uint32 x) ; | |
| /** @brief Fast @c sqrt approximation | |
| ** @copydoc vl_fast_sqrt_ui64 */ | |
| VL_INLINE vl_uint16 vl_fast_sqrt_ui16 (vl_uint16 x) ; | |
| /** @brief Fast @c sqrt approximation | |
| ** @copydoc vl_fast_sqrt_ui64 */ | |
| VL_INLINE vl_uint8 vl_fast_sqrt_ui8 (vl_uint8 x) ; | |
| VL_FAST_SQRT_UI(vl_uint64,ui64) | |
| VL_FAST_SQRT_UI(vl_uint32,ui32) | |
| VL_FAST_SQRT_UI(vl_uint16,ui16) | |
| VL_FAST_SQRT_UI(vl_uint8,ui8) | |
| /* ---------------------------------------------------------------- */ | |
| /* Vector distances and similarities */ | |
| /* ---------------------------------------------------------------- */ | |
| /** @typedef VlFloatVectorComparisonFunction | |
| ** @brief Pointer to a function to compare vectors of floats | |
| **/ | |
| typedef float (*VlFloatVectorComparisonFunction)(vl_size dimension, float const * X, float const * Y) ; | |
| /** @typedef VlDoubleVectorComparisonFunction | |
| ** @brief Pointer to a function to compare vectors of doubles | |
| **/ | |
| typedef double (*VlDoubleVectorComparisonFunction)(vl_size dimension, double const * X, double const * Y) ; | |
| /** @typedef VlFloatVector3ComparisonFunction | |
| ** @brief Pointer to a function to compare 3 vectors of doubles | |
| **/ | |
| typedef float (*VlFloatVector3ComparisonFunction)(vl_size dimension, float const * X, float const * Y, float const * Z) ; | |
| /** @typedef VlDoubleVector3ComparisonFunction | |
| ** @brief Pointer to a function to compare 3 vectors of doubles | |
| **/ | |
| typedef double (*VlDoubleVector3ComparisonFunction)(vl_size dimension, double const * X, double const * Y, double const * Z) ; | |
| /** @brief Vector comparison types */ | |
| enum _VlVectorComparisonType { | |
| VlDistanceL1, /**< l1 distance (squared intersection metric) */ | |
| VlDistanceL2, /**< squared l2 distance */ | |
| VlDistanceChi2, /**< squared Chi2 distance */ | |
| VlDistanceHellinger, /**< squared Hellinger's distance */ | |
| VlDistanceJS, /**< squared Jensen-Shannon distance */ | |
| VlDistanceMahalanobis, /**< squared mahalanobis distance */ | |
| VlKernelL1, /**< intersection kernel */ | |
| VlKernelL2, /**< l2 kernel */ | |
| VlKernelChi2, /**< Chi2 kernel */ | |
| VlKernelHellinger, /**< Hellinger's kernel */ | |
| VlKernelJS /**< Jensen-Shannon kernel */ | |
| } ; | |
| /** @brief Vector comparison types */ | |
| typedef enum _VlVectorComparisonType VlVectorComparisonType ; | |
| /** @brief Get the symbolic name of a vector comparison type | |
| ** @param type vector comparison type. | |
| ** @return data symbolic name. | |
| **/ | |
| VL_INLINE char const * | |
| vl_get_vector_comparison_type_name (int type) | |
| { | |
| switch (type) { | |
| case VlDistanceL1 : return "l1" ; | |
| case VlDistanceL2 : return "l2" ; | |
| case VlDistanceChi2 : return "chi2" ; | |
| case VlDistanceMahalanobis : return "mahalanobis" ; | |
| case VlKernelL1 : return "kl1" ; | |
| case VlKernelL2 : return "kl2" ; | |
| case VlKernelChi2 : return "kchi2" ; | |
| default: return NULL ; | |
| } | |
| } | |
| VL_EXPORT VlFloatVectorComparisonFunction | |
| vl_get_vector_comparison_function_f (VlVectorComparisonType type) ; | |
| VL_EXPORT VlDoubleVectorComparisonFunction | |
| vl_get_vector_comparison_function_d (VlVectorComparisonType type) ; | |
| VL_EXPORT VlFloatVector3ComparisonFunction | |
| vl_get_vector_3_comparison_function_f (VlVectorComparisonType type) ; | |
| VL_EXPORT VlDoubleVector3ComparisonFunction | |
| vl_get_vector_3_comparison_function_d (VlVectorComparisonType type) ; | |
| VL_EXPORT void | |
| vl_eval_vector_comparison_on_all_pairs_f (float * result, vl_size dimension, | |
| float const * X, vl_size numDataX, | |
| float const * Y, vl_size numDataY, | |
| VlFloatVectorComparisonFunction function) ; | |
| VL_EXPORT void | |
| vl_eval_vector_comparison_on_all_pairs_d (double * result, vl_size dimension, | |
| double const * X, vl_size numDataX, | |
| double const * Y, vl_size numDataY, | |
| VlDoubleVectorComparisonFunction function) ; | |
| /* ---------------------------------------------------------------- */ | |
| /* Numerical analysis */ | |
| /* ---------------------------------------------------------------- */ | |
| VL_EXPORT void | |
| vl_svd2 (double* S, double *U, double *V, double const *M) ; | |
| VL_EXPORT void | |
| vl_lapack_dlasv2 (double *smin, | |
| double *smax, | |
| double *sv, | |
| double *cv, | |
| double *su, | |
| double *cu, | |
| double f, | |
| double g, | |
| double h) ; | |
| VL_EXPORT int | |
| vl_solve_linear_system_3 (double * x, double const * A, double const *b) ; | |
| VL_EXPORT int | |
| vl_solve_linear_system_2 (double * x, double const * A, double const *b) ; | |
| VL_EXPORT int | |
| vl_gaussian_elimination (double * A, vl_size numRows, vl_size numColumns) ; | |
| /* VL_MATHOP_H */ | |