/** * @file tool_math.h * @brief 实现稠密向量函数原型。此模块是稠密线性代数模块的一部分 * This file is function prototypes for dense vector. * This module serves as part of dense linear algebra module. * @version 0.1 * @date 2021-09-17 * * @copyright Copyright (c) 2021 * */ #ifndef __TOOL_MATH_H__ #define __TOOL_MATH_H__ #include "csocp_config.h" #define CSOCP_MIN(X, Y) ((X) < (Y) ? (X) : (Y)) #define CSOCP_MAX(X, Y) ((X) > (Y) ? (X) : (Y)) #define CSOCP_ABS(X) ((X) < 0 ? -(X) : (X)) #define CSOCP_DIV(X, Y) ((Y) < 1e-13 ? c_math_divd((X) , 1e-13) : c_math_divd((X) , (Y))) /** 稠密向量加法 Dense vector addition */ void c_math_add(c_int nVec, /**< 向量维度 Dimension of vector */ c_real dFactor, /**< 缩放系数 Scaling factor */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 稠密向量减法 Dense vector subtraction */ void c_math_sub(c_int nVec, /**< 向量维度 Dimension of vector */ c_real dFactor, /**< 缩放系数 Scaling factor */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 稠密向量乘法 Dense vector multiplication */ void c_math_mul(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 稠密向量除法 Dense vector division */ void c_math_div(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 通过矩阵乘法进行向量缩放 Scale dense vector by multiplication */ void c_math_scalemul(c_int nVec, /**< 向量维度 Dimension of vector */ c_real dFactor, /**< 输入:缩放系数 Scaling factor */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 通过矩阵除法进行向量缩放 Scale dense vector by division */ void c_math_scalediv(c_int nVec, /**< 向量维度 Dimension of vector */ c_real dFactor, /**< 输入:缩放系数 Scaling factor */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 通过索引进行向量缩放 Scale dense vector by index */ void c_math_scalewithidx(c_int nVec, /**< 向量维度 Dimension of vector */ c_real dFactor, /**< 输入:缩放系数 Scaling factor */ c_int *srcIdx, /**< 输入:索引 Input index */ c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */ ); /** 复制double类型的稠密向量 Copy double dense vector */ void c_math_copydbl(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *dstVec, /**< 输出:稠密向量 Output dense vector */ c_int ifNegate /**< 是否取相反数 Whether to negate values */ ); /** 复制integer类型的稠密向量 Copy integer dense vector */ void c_math_copyint(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcVec, /**< 输入:稠密向量 Input dense vector */ c_int *dstVec, /**< 输出:稠密向量 Output dense vector */ c_int ifNegate /**< 是否取相反数 Whether to negate values */ ); /** 通过索引复制double类型的稠密向量 Copy dense double vector by index */ void c_math_copydblbyidx(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcIdx, /**< 输入:索引 Input index */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *dstVec, /**< 输出:稠密向量 Output dense vector */ c_int ifNegate /**< 是否取相反数 Whether to negate values */ ); /** 通过索引复制integer类型的稠密向量 Copy dense integer vector by index */ void c_math_copyintbyidx(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcIdx, /**< 输入:索引 Input index */ c_int *srcVec, /**< 输入:稠密向量 Input dense vector */ c_int *dstVec, /**< 输出:稠密向量 Output dense vector */ c_int ifNegate /**< 是否取相反数 Whether to negate values */ ); /** 复制2个稠密向量 Copy two dense vector by operator and index */ void c_math_copywithopidx(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcIdx, /**< 输入:索引 Input index */ c_real *srcX, /**< 输入:稠密向量 Input dense vector */ c_real *srcY, /**< 输入:稠密向量 Input dense vector */ c_real *dstVec, /**< 输出:稠密向量 Output dense vector */ c_int iSign /**< 相加/相减 Operator for input vectors */ ); /** 通过逆索引复制2个稠密向量 Copy dense double vector with inverse index */ void c_math_copydblbyinvidx(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcInvIdx, /**< 输入:逆索引 Input inverse index */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ c_real *dstVec /**< 输出:稠密向量 Output dense vector */ ); /** 用给定double值填充向量 Fill vector with given double value */ void c_math_filldbl(c_int nVec, /**< 向量维度 Dimension of vector */ c_real srcVal, /**< 输入:double类型稠密向量 Input double scalar */ c_real *dstVec /**< 输出:double类型稠密向量 Output dense vector */ ); /** 用给定double值填充向量 Fill vector with given integer value */ void c_math_fillint(c_int nVec, /**< 向量维度 Dimension of vector */ c_int srcVal, /**< 输入:integer类型稠密向量 Input integer scalar */ c_int *dstVec /**< 输出:integer类型稠密向量 Output dense vector */ ); /** 通过索引给向量元素赋值 Fill vector by index */ void c_math_fillbyidx(c_int nVec, /**< 向量维度 Dimension of vector */ c_real srcVal, /**< 输入:double类型标量 Input double scalar */ c_int *srcIdx1, /**< 一级索引 First level index */ c_int *srcIdx2, /**< 二级索引 Second level index */ c_real *dstVec /**< 输出:稠密向量 Output dense vector */ ); /** 稠密向量的2范数 2-norm of dense vector */ c_real c_math_norm2(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec /**< 输入:稠密向量 Input dense vector */ ); /** 稠密向量的无穷范数 Inf-norm of dense vector */ c_real c_math_norminf(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec /**< 输入:稠密向量 Input dense vector */ ); /** 稠密向量内积 Dot product of dense vectors */ c_real c_math_dot(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcX, /**< 输入:稠密向量 Input dense vector */ c_real *srcY /**< 输入:稠密向量 Input dense vector */ ); /** 稠密向量求和 Summation of dense vector */ c_real c_math_sum(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec /**< 输入:稠密向量 Input dense vector */ ); /** 稠密向量累计求和 Cumulative summation of dense vector */ void c_math_cumsum(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcVec, /**< 输入:稠密向量 Input dense vector */ c_int *dstVec /**< 输出:稠密向量 Output dense vector */ ); /** 稠密向量逆置换 Inverse permutation of dense vector */ void c_math_pinv(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcIdx, /**< 输入:索引向量 Input index */ c_int *dstIdx /**< 输出:索引向量 Output index */ ); /* * Dump methods */ /** 保存double类型的稠密向量到文件中 Dump double vector to file */ void c_math_dumpdbl(c_int nVec, /**< 向量维度 Dimension of vector */ c_real *srcVec, /**< 输入:稠密向量 Input dense vector */ char *vecFile /**< 存储稠密向量文件 Dumped vector file */ ); /** 保存integer类型的稠密向量到文件中 Dump integer vector to file */ void c_math_dumpint(c_int nVec, /**< 向量维度 Dimension of vector */ c_int *srcVec, /**< 输入:稠密向量 Input dense vector */ char *vecFile /**< 存储稠密向量文件 Dumped vector file */ ); /* * Speed up sqrt and divdide operator */ /** 双精度浮点数(double)除法重载函数 double division operator overload */ c_real c_math_divd(c_real A, /**< 被除数(分子) numerator */ c_real B /**< 除数(分母) denominator */ ); /** 双精度浮点数(double)开方重载函数 double sqrt operator overload */ c_real c_math_sqrt(c_real A /**< 被开方数 */ ); #endif