tool_math.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /**
  2. * @file tool_math.h
  3. * @brief 实现稠密向量函数原型。此模块是稠密线性代数模块的一部分
  4. * This file is function prototypes for dense vector.
  5. * This module serves as part of dense linear algebra module.
  6. * @version 0.1
  7. * @date 2021-09-17
  8. *
  9. * @copyright Copyright (c) 2021
  10. *
  11. */
  12. #ifndef __TOOL_MATH_H__
  13. #define __TOOL_MATH_H__
  14. #include "csocp_config.h"
  15. #define CSOCP_MIN(X, Y) ((X) < (Y) ? (X) : (Y))
  16. #define CSOCP_MAX(X, Y) ((X) > (Y) ? (X) : (Y))
  17. #define CSOCP_ABS(X) ((X) < 0 ? -(X) : (X))
  18. #define CSOCP_DIV(X, Y) ((Y) < 1e-13 ? c_math_divd((X) , 1e-13) : c_math_divd((X) , (Y)))
  19. /** 稠密向量加法 Dense vector addition */
  20. void c_math_add(c_int nVec, /**< 向量维度 Dimension of vector */
  21. c_real dFactor, /**< 缩放系数 Scaling factor */
  22. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  23. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  24. );
  25. /** 稠密向量减法 Dense vector subtraction */
  26. void c_math_sub(c_int nVec, /**< 向量维度 Dimension of vector */
  27. c_real dFactor, /**< 缩放系数 Scaling factor */
  28. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  29. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  30. );
  31. /** 稠密向量乘法 Dense vector multiplication */
  32. void c_math_mul(c_int nVec, /**< 向量维度 Dimension of vector */
  33. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  34. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  35. );
  36. /** 稠密向量除法 Dense vector division */
  37. void c_math_div(c_int nVec, /**< 向量维度 Dimension of vector */
  38. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  39. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  40. );
  41. /** 通过矩阵乘法进行向量缩放 Scale dense vector by multiplication */
  42. void c_math_scalemul(c_int nVec, /**< 向量维度 Dimension of vector */
  43. c_real dFactor, /**< 输入:缩放系数 Scaling factor */
  44. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  45. );
  46. /** 通过矩阵除法进行向量缩放 Scale dense vector by division */
  47. void c_math_scalediv(c_int nVec, /**< 向量维度 Dimension of vector */
  48. c_real dFactor, /**< 输入:缩放系数 Scaling factor */
  49. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  50. );
  51. /** 通过索引进行向量缩放 Scale dense vector by index */
  52. void c_math_scalewithidx(c_int nVec, /**< 向量维度 Dimension of vector */
  53. c_real dFactor, /**< 输入:缩放系数 Scaling factor */
  54. c_int *srcIdx, /**< 输入:索引 Input index */
  55. c_real *srcDstVec /**< 输入输出:稠密向量 Output + Input dense vector */
  56. );
  57. /** 复制double类型的稠密向量 Copy double dense vector */
  58. void c_math_copydbl(c_int nVec, /**< 向量维度 Dimension of vector */
  59. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  60. c_real *dstVec, /**< 输出:稠密向量 Output dense vector */
  61. c_int ifNegate /**< 是否取相反数 Whether to negate values */
  62. );
  63. /** 复制integer类型的稠密向量 Copy integer dense vector */
  64. void c_math_copyint(c_int nVec, /**< 向量维度 Dimension of vector */
  65. c_int *srcVec, /**< 输入:稠密向量 Input dense vector */
  66. c_int *dstVec, /**< 输出:稠密向量 Output dense vector */
  67. c_int ifNegate /**< 是否取相反数 Whether to negate values */
  68. );
  69. /** 通过索引复制double类型的稠密向量 Copy dense double vector by index */
  70. void c_math_copydblbyidx(c_int nVec, /**< 向量维度 Dimension of vector */
  71. c_int *srcIdx, /**< 输入:索引 Input index */
  72. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  73. c_real *dstVec, /**< 输出:稠密向量 Output dense vector */
  74. c_int ifNegate /**< 是否取相反数 Whether to negate values */
  75. );
  76. /** 通过索引复制integer类型的稠密向量 Copy dense integer vector by index */
  77. void c_math_copyintbyidx(c_int nVec, /**< 向量维度 Dimension of vector */
  78. c_int *srcIdx, /**< 输入:索引 Input index */
  79. c_int *srcVec, /**< 输入:稠密向量 Input dense vector */
  80. c_int *dstVec, /**< 输出:稠密向量 Output dense vector */
  81. c_int ifNegate /**< 是否取相反数 Whether to negate values */
  82. );
  83. /** 复制2个稠密向量 Copy two dense vector by operator and index */
  84. void c_math_copywithopidx(c_int nVec, /**< 向量维度 Dimension of vector */
  85. c_int *srcIdx, /**< 输入:索引 Input index */
  86. c_real *srcX, /**< 输入:稠密向量 Input dense vector */
  87. c_real *srcY, /**< 输入:稠密向量 Input dense vector */
  88. c_real *dstVec, /**< 输出:稠密向量 Output dense vector */
  89. c_int iSign /**< 相加/相减 Operator for input vectors */
  90. );
  91. /** 通过逆索引复制2个稠密向量 Copy dense double vector with inverse index */
  92. void c_math_copydblbyinvidx(c_int nVec, /**< 向量维度 Dimension of vector */
  93. c_int *srcInvIdx, /**< 输入:逆索引 Input inverse index */
  94. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  95. c_real *dstVec /**< 输出:稠密向量 Output dense vector */
  96. );
  97. /** 用给定double值填充向量 Fill vector with given double value */
  98. void c_math_filldbl(c_int nVec, /**< 向量维度 Dimension of vector */
  99. c_real srcVal, /**< 输入:double类型稠密向量 Input double scalar */
  100. c_real *dstVec /**< 输出:double类型稠密向量 Output dense vector */
  101. );
  102. /** 用给定double值填充向量 Fill vector with given integer value */
  103. void c_math_fillint(c_int nVec, /**< 向量维度 Dimension of vector */
  104. c_int srcVal, /**< 输入:integer类型稠密向量 Input integer scalar */
  105. c_int *dstVec /**< 输出:integer类型稠密向量 Output dense vector */
  106. );
  107. /** 通过索引给向量元素赋值 Fill vector by index */
  108. void c_math_fillbyidx(c_int nVec, /**< 向量维度 Dimension of vector */
  109. c_real srcVal, /**< 输入:double类型标量 Input double scalar */
  110. c_int *srcIdx1, /**< 一级索引 First level index */
  111. c_int *srcIdx2, /**< 二级索引 Second level index */
  112. c_real *dstVec /**< 输出:稠密向量 Output dense vector */
  113. );
  114. /** 稠密向量的2范数 2-norm of dense vector */
  115. c_real c_math_norm2(c_int nVec, /**< 向量维度 Dimension of vector */
  116. c_real *srcVec /**< 输入:稠密向量 Input dense vector */
  117. );
  118. /** 稠密向量的无穷范数 Inf-norm of dense vector */
  119. c_real c_math_norminf(c_int nVec, /**< 向量维度 Dimension of vector */
  120. c_real *srcVec /**< 输入:稠密向量 Input dense vector */
  121. );
  122. /** 稠密向量内积 Dot product of dense vectors */
  123. c_real c_math_dot(c_int nVec, /**< 向量维度 Dimension of vector */
  124. c_real *srcX, /**< 输入:稠密向量 Input dense vector */
  125. c_real *srcY /**< 输入:稠密向量 Input dense vector */
  126. );
  127. /** 稠密向量求和 Summation of dense vector */
  128. c_real c_math_sum(c_int nVec, /**< 向量维度 Dimension of vector */
  129. c_real *srcVec /**< 输入:稠密向量 Input dense vector */
  130. );
  131. /** 稠密向量累计求和 Cumulative summation of dense vector */
  132. void c_math_cumsum(c_int nVec, /**< 向量维度 Dimension of vector */
  133. c_int *srcVec, /**< 输入:稠密向量 Input dense vector */
  134. c_int *dstVec /**< 输出:稠密向量 Output dense vector */
  135. );
  136. /** 稠密向量逆置换 Inverse permutation of dense vector */
  137. void c_math_pinv(c_int nVec, /**< 向量维度 Dimension of vector */
  138. c_int *srcIdx, /**< 输入:索引向量 Input index */
  139. c_int *dstIdx /**< 输出:索引向量 Output index */
  140. );
  141. /*
  142. * Dump methods
  143. */
  144. /** 保存double类型的稠密向量到文件中 Dump double vector to file */
  145. void c_math_dumpdbl(c_int nVec, /**< 向量维度 Dimension of vector */
  146. c_real *srcVec, /**< 输入:稠密向量 Input dense vector */
  147. char *vecFile /**< 存储稠密向量文件 Dumped vector file */
  148. );
  149. /** 保存integer类型的稠密向量到文件中 Dump integer vector to file */
  150. void c_math_dumpint(c_int nVec, /**< 向量维度 Dimension of vector */
  151. c_int *srcVec, /**< 输入:稠密向量 Input dense vector */
  152. char *vecFile /**< 存储稠密向量文件 Dumped vector file */
  153. );
  154. /*
  155. * Speed up sqrt and divdide operator
  156. */
  157. /** 双精度浮点数(double)除法重载函数 double division operator overload */
  158. c_real c_math_divd(c_real A, /**< 被除数(分子) numerator */
  159. c_real B /**< 除数(分母) denominator */
  160. );
  161. /** 双精度浮点数(double)开方重载函数 double sqrt operator overload */
  162. c_real c_math_sqrt(c_real A /**< 被开方数 */
  163. );
  164. #endif