PageRenderTime 48ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/SqlSpatialIndexing/Converters/MatrixConverter.cs

#
C# | 339 lines | 271 code | 54 blank | 14 comment | 13 complexity | 4465b60d450e1007e97fee1b60cb72d6 MD5 | raw file
  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Data.SqlTypes;
  5. using Microsoft.SqlServer.Server;
  6. using System.Collections.Generic;
  7. namespace Elte.SqlSpIdx.Converters
  8. {
  9. public partial class MatrixConverter :Converter
  10. {
  11. [Microsoft.SqlServer.Server.SqlFunction]
  12. public static SqlBinary MatrixRow_1(SqlBinary v1)
  13. {
  14. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value) }));
  15. }
  16. [Microsoft.SqlServer.Server.SqlFunction]
  17. public static SqlBinary MatrixRow_2(SqlBinary v1, SqlBinary v2)
  18. {
  19. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value) }));
  20. }
  21. [Microsoft.SqlServer.Server.SqlFunction]
  22. public static SqlBinary MatrixRow_3(SqlBinary v1, SqlBinary v2, SqlBinary v3)
  23. {
  24. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value) }));
  25. }
  26. [Microsoft.SqlServer.Server.SqlFunction]
  27. public static SqlBinary MatrixRow_4(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4)
  28. {
  29. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value) }));
  30. }
  31. [Microsoft.SqlServer.Server.SqlFunction]
  32. public static SqlBinary MatrixRow_5(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5)
  33. {
  34. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value) }));
  35. }
  36. [Microsoft.SqlServer.Server.SqlFunction]
  37. public static SqlBinary MatrixRow_6(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6)
  38. {
  39. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value) }));
  40. }
  41. [Microsoft.SqlServer.Server.SqlFunction]
  42. public static SqlBinary MatrixRow_7(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7)
  43. {
  44. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value) }));
  45. }
  46. [Microsoft.SqlServer.Server.SqlFunction]
  47. public static SqlBinary MatrixRow_8(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7, SqlBinary v8)
  48. {
  49. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value), VectorConverter.ToArray(v8.Value) }));
  50. }
  51. [Microsoft.SqlServer.Server.SqlFunction]
  52. public static SqlBinary MatrixRow_9(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7, SqlBinary v8, SqlBinary v9)
  53. {
  54. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value), VectorConverter.ToArray(v8.Value), VectorConverter.ToArray(v9.Value) }));
  55. }
  56. [Microsoft.SqlServer.Server.SqlFunction]
  57. public static SqlBinary MatrixRow_10(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7, SqlBinary v8, SqlBinary v9, SqlBinary v10)
  58. {
  59. return new SqlBinary(ToBinary(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value), VectorConverter.ToArray(v8.Value), VectorConverter.ToArray(v9.Value), VectorConverter.ToArray(v10.Value) }));
  60. }
  61. [Microsoft.SqlServer.Server.SqlFunction]
  62. public static SqlBinary MatrixCol_1(SqlBinary v1)
  63. {
  64. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value) });
  65. }
  66. [Microsoft.SqlServer.Server.SqlFunction]
  67. public static SqlBinary MatrixCol_2(SqlBinary v1, SqlBinary v2)
  68. {
  69. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value) });
  70. }
  71. [Microsoft.SqlServer.Server.SqlFunction]
  72. public static SqlBinary MatrixCol_3(SqlBinary v1, SqlBinary v2, SqlBinary v3)
  73. {
  74. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value) });
  75. }
  76. [Microsoft.SqlServer.Server.SqlFunction]
  77. public static SqlBinary MatrixCol_4(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4)
  78. {
  79. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value) });
  80. }
  81. [Microsoft.SqlServer.Server.SqlFunction]
  82. public static SqlBinary MatrixCol_5(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5)
  83. {
  84. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value) });
  85. }
  86. [Microsoft.SqlServer.Server.SqlFunction]
  87. public static SqlBinary MatrixCol_6(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6)
  88. {
  89. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value) });
  90. }
  91. [Microsoft.SqlServer.Server.SqlFunction]
  92. public static SqlBinary MatrixCol_7(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7)
  93. {
  94. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value) });
  95. }
  96. [Microsoft.SqlServer.Server.SqlFunction]
  97. public static SqlBinary MatrixCol_8(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7, SqlBinary v8)
  98. {
  99. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value), VectorConverter.ToArray(v8.Value) });
  100. }
  101. [Microsoft.SqlServer.Server.SqlFunction]
  102. public static SqlBinary MatrixCol_9(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7, SqlBinary v8, SqlBinary v9)
  103. {
  104. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value), VectorConverter.ToArray(v8.Value), VectorConverter.ToArray(v9.Value) });
  105. }
  106. [Microsoft.SqlServer.Server.SqlFunction]
  107. public static SqlBinary MatrixCol_10(SqlBinary v1, SqlBinary v2, SqlBinary v3, SqlBinary v4, SqlBinary v5, SqlBinary v6, SqlBinary v7, SqlBinary v8, SqlBinary v9, SqlBinary v10)
  108. {
  109. return MatrixCol_n(new double[][] { VectorConverter.ToArray(v1.Value), VectorConverter.ToArray(v2.Value), VectorConverter.ToArray(v3.Value), VectorConverter.ToArray(v4.Value), VectorConverter.ToArray(v5.Value), VectorConverter.ToArray(v6.Value), VectorConverter.ToArray(v7.Value), VectorConverter.ToArray(v8.Value), VectorConverter.ToArray(v9.Value), VectorConverter.ToArray(v10.Value) });
  110. }
  111. private static SqlBinary MatrixCol_n(double[][] vectors)
  112. {
  113. double[][] mat = new double[vectors[0].Length][];
  114. for (int i = 0; i < mat.Length; i++)
  115. {
  116. mat[i] = new double[vectors.Length];
  117. for (int j = 0; j < mat[i].Length; j++)
  118. mat[i][j] = vectors[j][i];
  119. }
  120. return new SqlBinary(ToBinary(mat));
  121. }
  122. #if unsafe
  123. [Microsoft.SqlServer.Server.SqlFunction]
  124. unsafe public static SqlSingle MatrixItem(SqlBinary v, SqlInt32 i, SqlInt32 j)
  125. {
  126. float res;
  127. int imax, jmax;
  128. fixed (byte* b = v.Value)
  129. {
  130. int* ii = (int*)b;
  131. imax = *ii++;
  132. jmax = *ii++;
  133. float* f = (float*)ii;
  134. res = *(f + i.Value * imax + j.Value);
  135. }
  136. return res;
  137. }
  138. #else
  139. [Microsoft.SqlServer.Server.SqlFunction]
  140. public static SqlDouble MatrixItem(SqlBinary v, SqlInt32 i, SqlInt32 j)
  141. {
  142. int cols = BitConverter.ToInt32(v.Value, 0);
  143. return new SqlDouble(BitConverter.ToDouble(v.Value, sizeof(int) + sizeof(int) + sizeof(double) * (i.Value * cols + j.Value)));
  144. }
  145. #endif
  146. [Microsoft.SqlServer.Server.SqlFunction]
  147. public static SqlInt32 MatrixCols(SqlBinary v)
  148. {
  149. return BitConverter.ToInt32(v.Value, sizeof(int));
  150. }
  151. [Microsoft.SqlServer.Server.SqlFunction]
  152. public static SqlInt32 MatrixRows(SqlBinary v)
  153. {
  154. return BitConverter.ToInt32(v.Value, 0);
  155. }
  156. [Microsoft.SqlServer.Server.SqlFunction]
  157. public static SqlBinary MatrixRow(SqlBinary matrix, SqlInt32 i)
  158. {
  159. return VectorConverter.ToBinary(MatrixConverter.ToArray(matrix.Value)[i.Value]);
  160. }
  161. [Microsoft.SqlServer.Server.SqlFunction]
  162. public static SqlBinary MatrixCol(SqlBinary matrix, SqlInt32 j)
  163. {
  164. double[][] m = MatrixConverter.ToArray(matrix.Value);
  165. double[] v = new double[m.Length];
  166. for (int i = 0; i < v.Length; i++)
  167. v[i] = m[i][j.Value];
  168. return VectorConverter.ToBinary(v);
  169. }
  170. [Microsoft.SqlServer.Server.SqlFunction]
  171. public static SqlString MatrixToString(SqlBinary v)
  172. {
  173. double[][] m = ToArray(v.Value);
  174. string res = "";
  175. for (int i = 0; i < m.Length; i++)
  176. {
  177. string line = "";
  178. for (int j = 0; j < m[i].Length; j++)
  179. line += " " + m[i][j].ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
  180. res += "{" + line.Substring(1) + "}";
  181. }
  182. return new SqlString("{" + res + "}");
  183. }
  184. [Microsoft.SqlServer.Server.SqlFunction]
  185. public static SqlBinary MatrixFromString(SqlString str)
  186. {
  187. int p = 0;
  188. return ToBinary(ReadMatrix(str.Value, ref p));
  189. }
  190. /*
  191. [Microsoft.SqlServer.Server.SqlFunction]
  192. public static SqlBinary MatrixFromInequalities(SqlString expression, SqlString variableNames)
  193. {
  194. int dim = 1;
  195. for (int i = 0; i < variableNames.Value.Length; i++)
  196. if (variableNames.Value[i] == ',') dim++;
  197. Parser.Parser p = new Parser.Parser(new Parser.Tokenizer(), new Parser.VariableMapper(variableNames.Value));
  198. InequalitySystem ls = p.Parse(expression.Value, dim);
  199. return ToBinary(ls.GetInhomogenMatrix());
  200. }
  201. * */
  202. #if unsafe
  203. unsafe internal static byte[] ToBinary(float[][] data)
  204. {
  205. int size = data.Length * data[0].Length;
  206. byte[] buffer = new byte[(size << 2) + 8];
  207. fixed (byte* b = buffer)
  208. {
  209. int* ii = (int*)b;
  210. *(ii++) = data.Length;
  211. *(ii++) = data[0].Length;
  212. float* f = (float*)ii;
  213. for (int i = 0; i < data.Length; i++)
  214. for (int j = 0; j < data[0].Length; j++)
  215. *(f++) = data[i][j];
  216. }
  217. return buffer;
  218. }
  219. #else
  220. internal static byte[] ToBinary(double[][] data)
  221. {
  222. int size = data.Length * data[0].Length;
  223. byte[] buffer = new byte[size * sizeof(double) + sizeof(int) + sizeof(int) ];
  224. Array.Copy(BitConverter.GetBytes(data.Length), 0, buffer, 0, sizeof(int));
  225. Array.Copy(BitConverter.GetBytes(data[0].Length), 0, buffer, sizeof(int), sizeof(int));
  226. int q = sizeof(int) + sizeof(int);
  227. for (int i = 0; i < data.Length; i ++)
  228. for (int j = 0; j < data[i].Length; j++)
  229. {
  230. Array.Copy(BitConverter.GetBytes(data[i][j]), 0, buffer, q, sizeof(double));
  231. q += sizeof(double);
  232. }
  233. return buffer;
  234. }
  235. #endif
  236. internal static double[][] ToArray(SqlBinary data)
  237. {
  238. return ToArray(data.Value);
  239. }
  240. #if unsafe
  241. unsafe internal static float[][] ToArray(byte[] data)
  242. {
  243. float[][] array;
  244. int imax, jmax;
  245. fixed (byte* b = data)
  246. {
  247. int* ii = (int*)b;
  248. imax = *(ii++);
  249. jmax = *(ii++);
  250. float* f = (float*)ii;
  251. array = new float[imax][];
  252. for (int i = 0; i < imax; i++)
  253. {
  254. array[i] = new float[jmax];
  255. for (int j = 0; j < jmax; j++)
  256. array[i][j] = *(f++);
  257. }
  258. }
  259. return array;
  260. }
  261. #else
  262. internal static double[][] ToArray(byte[] data)
  263. {
  264. double[][] array;
  265. int rows, cols;
  266. rows = BitConverter.ToInt32(data, 0);
  267. cols = BitConverter.ToInt32(data, sizeof(int));
  268. int q = sizeof(int) + sizeof(int);
  269. array = new double[rows][];
  270. for (int i = 0; i < rows; i++)
  271. {
  272. array[i] = new double[cols];
  273. for (int j = 0; j < cols; j++)
  274. {
  275. array[i][j] = BitConverter.ToDouble(data, q);
  276. q += sizeof(double);
  277. }
  278. }
  279. return array;
  280. }
  281. #endif
  282. }
  283. }