123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /**
- * @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
|