private unsafe void LLt(Decimal[,] value) { n = value.GetLength(0); L = new Decimal[n, n]; D = new Decimal[n]; for (int i = 0; i < D.Length; i++) { D[i] = 1; } robust = false; Decimal[,] a = value; this.positiveDefinite = true; this.symmetric = true; fixed(Decimal *ptrL = L) { for (int j = 0; j < n; j++) { Decimal *Lrowj = ptrL + j * n; Decimal d = 0; for (int k = 0; k < j; k++) { Decimal *Lrowk = ptrL + k * n; Decimal s = 0; for (int i = 0; i < k; i++) { s += Lrowk[i] * Lrowj[i]; } Lrowj[k] = s = (a[j, k] - s) / Lrowk[k]; d += s * s; this.symmetric = this.symmetric & (a[k, j] == a[j, k]); } d = a[j, j] - d; // Use a tolerance for positive-definiteness this.positiveDefinite &= (d > (Decimal)1e-14 * Math.Abs(a[j, j])); Lrowj[j] = (Decimal)System.Math.Sqrt((double)System.Math.Max(d, 0)); for (int k = j + 1; k < n; k++) { Lrowj[k] = 0; } } } }
/// <summary> /// Constructs a new LU decomposition. /// </summary> /// <param name="value">The matrix A to be decomposed.</param> /// <param name="transpose">True if the decomposition should be performed on /// the transpose of A rather than A itself, false otherwise. Default is false.</param> /// <param name="inPlace">True if the decomposition should be performed over the /// <paramref name="value"/> matrix rather than on a copy of it. If true, the /// matrix will be destroyed during the decomposition. Default is false.</param> /// public LuDecompositionD(Decimal[,] value, bool transpose, bool inPlace) { if (value == null) { throw new ArgumentNullException("value", "Matrix cannot be null."); } if (transpose) { this.lu = value.Transpose(inPlace); } else { this.lu = inPlace ? value : (Decimal[, ])value.Clone(); } this.rows = lu.GetLength(0); this.cols = lu.GetLength(1); this.pivotSign = 1; this.pivotVector = new int[rows]; for (int i = 0; i < rows; i++) { pivotVector[i] = i; } var LUcolj = new Decimal[rows]; unsafe { fixed(Decimal *LU = lu) { // Outer loop. for (int j = 0; j < cols; j++) { // Make a copy of the j-th column to localize references. for (int i = 0; i < rows; i++) { LUcolj[i] = lu[i, j]; } // Apply previous transformations. for (int i = 0; i < rows; i++) { Decimal s = 0; // Most of the time is spent in // the following dot product: int kmax = Math.Min(i, j); Decimal *LUrowi = &LU[i * cols]; for (int k = 0; k < kmax; k++) { s += LUrowi[k] * LUcolj[k]; } LUrowi[j] = LUcolj[i] -= s; } // Find pivot and exchange if necessary. int p = j; for (int i = j + 1; i < rows; i++) { if (Math.Abs(LUcolj[i]) > Math.Abs(LUcolj[p])) { p = i; } } if (p != j) { for (int k = 0; k < cols; k++) { var t = lu[p, k]; lu[p, k] = lu[j, k]; lu[j, k] = t; } int v = pivotVector[p]; pivotVector[p] = pivotVector[j]; pivotVector[j] = v; pivotSign = -pivotSign; } // Compute multipliers. if (j < rows && lu[j, j] != 0) { for (int i = j + 1; i < rows; i++) { lu[i, j] /= lu[j, j]; } } } } } }
public static int Func_0() { Decimal *a36_0 = stackalloc Decimal[1]; *a36_0 = 137438953472M; vtstatic_0.a0_0 = 3.7914999471280252E-09; vtstatic_0.a2_0 = 5.0980403367171836E-10; vtstatic_0.a11_0 = 43182.316630581954; vtstatic_0.a21_0 = 0.03125; vtstatic_0.a25_0 = 2228713468L; vtstatic_0.a31_0 = 246082L; vtstatic_0.a38_0 = 37004L; vtstatic_0.a70_0 = 7745; vtstatic_0.a74_0 = 37005; s_arr2d_0[2, 10] = 1267746681; clstatic_0.arr1d_0[28] = 54765; clstatic_0.arr3d_0[4, 54, 3] = -1267746680; double asgop0 = 8.3079175512520556E-13; asgop0 += ((8.3079175512520556E-13 + -43182.324443081954)); Decimal asgop1 = s_a91_0; asgop1 -= (Convert.ToDecimal(Convert.ToDecimal((Convert.ToDecimal(clstatic_0.a26_0) * (Convert.ToDecimal((Convert.ToDecimal(s_a91_0) + Convert.ToDecimal(0M))) - Convert.ToDecimal((Convert.ToDecimal(clstatic_0.a17_0) * -78.675448098098607849784913059M))))))); long asgop2 = s_a16_0; asgop2 /= (Convert.ToInt64((s_a16_0 + 3938106313891559120L))); double asgop3 = clstatic_0.a57_0; asgop3 -= (((clstatic_0.a57_0 + clstatic_0.a40_0))); double asgop4 = -0.00384521484375; asgop4 -= (156519.99615478516); double asgop5 = clstatic_0.a94_0; asgop5 -= (((clstatic_0.a94_0 - (clstatic_0.a94_0 - ((1 * -0.14578177034854889)))))); short asgop6 = 16062; asgop6 /= (1); double asgop7 = vtstatic_0.a21_0; asgop7 -= (43182.324443081954); Decimal asgop8 = 10.4980392156863M; asgop8 -= (Convert.ToDecimal(Convert.ToDecimal((Convert.ToDecimal(10.4980392156863M) - Convert.ToDecimal(37.0933021099920M))))); float asgop9 = 1.0F; asgop9 += (8191.0F); Decimal asgop10 = s_a91_0; asgop10 += (Convert.ToDecimal(Convert.ToDecimal(0M))); asgop7 += (vtstatic_0.a11_0); Decimal asgop12 = s_a91_0; asgop12 -= (Convert.ToDecimal(Convert.ToDecimal(0M))); asgop12 += (Convert.ToDecimal(Convert.ToDecimal((Convert.ToDecimal(asgop10) - Convert.ToDecimal(-270597565911.875M))))); long asgop14 = vtstatic_0.a31_0; asgop14 /= (Convert.ToInt64(vtstatic_0.a31_0)); long asgop15 = 1L; asgop15 /= (Convert.ToInt64(1L)); int asgop16 = s_arr2d_0[2, 10]; asgop16 *= ((Convert.ToInt32(vtstatic_0.a74_0) + (Convert.ToInt32(s_arr2d_0[2, 10] * -2.91887965905075E-05)))); long asgop17 = 1L; asgop17 -= ((Convert.ToInt64(Convert.ToUInt16(vtstatic_0.a74_0) - Convert.ToInt64(clstatic_0.a89_0)))); long asgop18 = 64L; asgop18 /= (Convert.ToInt64(1L)); double asgop19 = -0.00384521484375; asgop19 -= (((-0.00384521484375 + asgop4))); long asgop20 = clstatic_0.a27_0; asgop20 *= (Convert.ToInt64(Convert.ToInt64(1L))); (*a36_0) -= (Convert.ToDecimal((Convert.ToDecimal(asgop1)))); long asgop22 = clstatic_0.a96_0; asgop22 *= (Convert.ToInt64(Convert.ToInt64(Convert.ToInt64(Convert.ToUInt16(vtstatic_0.a74_0) + Convert.ToInt64(clstatic_0.a48_0))))); asgop3 += ((((asgop9 * 1.0F) * -5.2712798392434026) + vtstatic_0.a21_0)); double asgop24 = -0.14578177034854889; asgop24 /= (1.0); long asgop25 = vtstatic_0.a31_0; asgop25 *= (Convert.ToInt64(Convert.ToInt64((Convert.ToInt64((Convert.ToInt64(vtstatic_0.a31_0) * Convert.ToInt64(1L)) / (Convert.ToInt64(vtstatic_0.a31_0 / asgop14))))))); int asgop26 = s_arr2d_0[2, 10]; asgop26 /= ((Convert.ToInt32((Convert.ToInt32((Convert.ToInt32(Convert.ToInt64(vtstatic_0.a31_0) - Convert.ToInt64((-1625069246L)))))) % (Convert.ToInt32((Convert.ToInt32(s_arr2d_0[2, 10] * 1.2820505479201487))))))); int asgop27 = s_a18_0; asgop27 -= (clstatic_0.arr1d_0[28]); asgop3 -= (asgop7); asgop3 += ((((vtstatic_0.a70_0 - (((vtstatic_0.a70_0 - 62509) - 997234106))) / (vtstatic_0.a70_0 * clstatic_0.a50_0)) + ((vtstatic_0.a70_0 * s_a66_0) + ((s_a66_0 - 0.0) + (clstatic_0.a26_0 / vtstatic_0.a0_0))))); asgop3 += ((Convert.ToSingle(Convert.ToInt16(8192.0F - (clstatic_0.a6_0)) / asgop19) / (((s_a8_0 - s_a83_0) - ((s_a83_0 - 0.0) - 156518.00390625)) - ((Convert.ToUInt64(Convert.ToUInt16(Convert.ToUInt16(vtstatic_0.a70_0 * Convert.ToSingle(4.777921F))) + Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(3938106313891559120L) * clstatic_0.a88_0))) / (clstatic_0.a88_0 - 74.645457766197779)))))); short asgop31 = 32537; asgop31 %= Convert.ToInt16((Convert.ToInt16((Convert.ToInt16(16475))))); double asgop32 = -2517.6143380671915; asgop32 += (2517.6768380671915); asgop24 /= (vtstatic_0.a2_0); int asgop34 = s_arr2d_0[2, 10]; asgop34 += (clstatic_0.arr3d_0[4, 54, 3]); double asgop35 = 8.3079175512520556E-13; asgop35 -= ((asgop0)); return(Convert.ToInt32((Convert.ToInt32((Convert.ToInt32((Convert.ToInt32(Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(Convert.ToInt64(Convert.ToUInt16(Convert.ToUInt16(asgop26 / Convert.ToSingle(Convert.ToSingle(Convert.ToUInt64(Convert.ToInt16(asgop6) + Convert.ToInt64(Convert.ToInt64(Convert.ToUInt16(vtstatic_0.a74_0) - Convert.ToInt64((Convert.ToInt64(clstatic_0.a17_0) + -1747119413L))))) * asgop5)))) - Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(asgop25) * asgop24)))) * (Convert.ToDouble((Convert.ToInt64((Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(Convert.ToInt64(Convert.ToDouble(clstatic_0.a27_0) * -1.1920928960153885E-07)) * (Convert.ToInt16(1 * s_a18_0) * (clstatic_0.a27_0 / -4503599625452928.0)))) * Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(asgop20) / (Convert.ToUInt32(vtstatic_0.a74_0 + 1746873331) * -2517.6143380671915))))) * Convert.ToInt64((Convert.ToInt64((Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(s_a61_0) * asgop32)) * Convert.ToInt64(64L)) / (Convert.ToInt64((Convert.ToInt64((asgop18 + 0L) / asgop15)) / clstatic_0.a96_0)))))) * (Convert.ToUInt32(Convert.ToUInt32(Convert.ToInt32(s_a18_0 / 7.8880111854144145E-10) / Convert.ToDouble(Convert.ToDecimal(10.4980392156863M) / Convert.ToDecimal(35.3437719552881165816490907M))) % Convert.ToUInt32(Convert.ToInt64(asgop22) + Convert.ToInt64(vtstatic_0.a25_0))) * (Convert.ToDouble((Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(vtstatic_0.a25_0) * 1.7947574048581106E-09)) * Convert.ToInt64(Convert.ToInt64(Convert.ToDouble(vtstatic_0.a25_0) * 4.4868935121452766E-10))) * 8.3079175512520556E-13))))))) + Convert.ToInt64(Convert.ToInt64(Convert.ToUInt16((Convert.ToUInt16(Convert.ToUInt16(Convert.ToInt16(Convert.ToDecimal(asgop31) / (Convert.ToDecimal(clstatic_0.a26_0) * s_a75_0)) + Convert.ToInt16(Convert.ToInt64(Convert.ToInt64(clstatic_0.a26_0 - 7UL)) + Convert.ToInt64(asgop17))) % (Convert.ToUInt16(asgop16 / asgop35))))) - Convert.ToInt64(Convert.ToInt64(Convert.ToUInt16(Convert.ToUInt16(Convert.ToInt16(Convert.ToInt16(16475 / s_a18_0) * Convert.ToSingle(0.4701062F)) * Convert.ToSingle(Convert.ToSingle(vtstatic_0.a70_0 * (s_a42_0 / 223377976.25057024))))) - Convert.ToInt64((Convert.ToInt64(Convert.ToInt64(Convert.ToUInt16(Convert.ToUInt16(0.00013283314898831372 + (0.00013283314898831372 + (0.00013283314898831372 + 37004.999601500553)))) - Convert.ToInt64(vtstatic_0.a38_0))) * Convert.ToInt64((Convert.ToInt64(Convert.ToInt64(Convert.ToUInt32(clstatic_0.a17_0) - Convert.ToInt64(clstatic_0.a98_0))) * Convert.ToInt64((Convert.ToInt64(clstatic_0.a17_0) + clstatic_0.a68_0)))))))))))))) % (Convert.ToInt32(Convert.ToInt32((Convert.ToInt32((Convert.ToInt32(Convert.ToInt32(Convert.ToDecimal((Convert.ToInt32((Convert.ToUInt16((Convert.ToUInt16(Convert.ToInt32(asgop34) - Convert.ToInt32((asgop27)))) % vtstatic_0.a74_0))) + (Convert.ToInt32(Convert.ToInt64(s_a16_0) + Convert.ToInt64(Convert.ToInt64(Convert.ToInt32((clstatic_0.arr1d_0[28] + -109529)) - Convert.ToInt64(s_a86_0))))))) * (Convert.ToDecimal(Convert.ToInt64(Convert.ToDouble(s_a16_0) * clstatic_0.a57_0)) / asgop8)))) % (Convert.ToInt32(Convert.ToInt32((*a36_0) + (Convert.ToDecimal(asgop2 * asgop12))))))) / asgop3))))))); }
private unsafe string EncodeObject( object data, MofField *mofField, char *ptr, ref uint offSet) { if (data == null) { mofField->DataLength = 0U; mofField->DataPointer = null; return(null); } Type type = data.GetType(); if (type.IsEnum) { data = Convert.ChangeType(data, Enum.GetUnderlyingType(type), CultureInfo.InvariantCulture); } switch (data) { case sbyte num: mofField->DataLength = 1U; sbyte *numPtr1 = (sbyte *)ptr; * numPtr1 = num; mofField->DataPointer = numPtr1; ++offSet; break; case byte num: mofField->DataLength = 1U; byte *numPtr2 = (byte *)ptr; * numPtr2 = num; mofField->DataPointer = numPtr2; ++offSet; break; case short num: mofField->DataLength = 2U; short *numPtr3 = (short *)ptr; * numPtr3 = num; mofField->DataPointer = numPtr3; offSet += 2U; break; case ushort num: mofField->DataLength = 2U; ushort *numPtr4 = (ushort *)ptr; * numPtr4 = num; mofField->DataPointer = numPtr4; offSet += 2U; break; case int num: mofField->DataLength = 4U; int *numPtr5 = (int *)ptr; * numPtr5 = num; mofField->DataPointer = numPtr5; offSet += 4U; break; case uint num: mofField->DataLength = 4U; uint *numPtr6 = (uint *)ptr; * numPtr6 = num; mofField->DataPointer = numPtr6; offSet += 4U; break; case long num: mofField->DataLength = 8U; long *numPtr7 = (long *)ptr; * numPtr7 = num; mofField->DataPointer = numPtr7; offSet += 8U; break; case ulong num: mofField->DataLength = 8U; ulong *numPtr8 = (ulong *)ptr; * numPtr8 = num; mofField->DataPointer = numPtr8; offSet += 8U; break; case char ch: mofField->DataLength = 2U; char *chPtr = ptr; * chPtr = ch; mofField->DataPointer = chPtr; offSet += 2U; break; case float num: mofField->DataLength = 4U; float *numPtr9 = (float *)ptr; * numPtr9 = num; mofField->DataPointer = numPtr9; offSet += 4U; break; case double num: mofField->DataLength = 8U; double *numPtr10 = (double *)ptr; * numPtr10 = num; mofField->DataPointer = numPtr10; offSet += 8U; break; case bool flag: mofField->DataLength = 1U; bool *flagPtr = (bool *)ptr; * flagPtr = flag; mofField->DataPointer = flagPtr; ++offSet; break; case Decimal num: mofField->DataLength = 16U; Decimal *numPtr11 = (Decimal *)ptr; * numPtr11 = num; mofField->DataPointer = numPtr11; offSet += 16U; break; default: return(data.ToString()); } return(null); }
private unsafe string EncodeObject(object data, TraceProvider.MofField *mofField, char *ptr, ref uint offSet, byte *ptrArgInfo) { if (data == null) { if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)0; *(short *)(ptrArgInfo + 1) = (short)0; } mofField->DataLength = 0U; mofField->DataPointer = (void *)null; return((string)null); } string str1 = data as string; if (str1 != null) { if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)2; *(short *)(ptrArgInfo + 1) = str1.Length < (int)ushort.MaxValue ? (short)(ushort)str1.Length : (short)-1; } else { mofField->DataLength = 2U; ushort *numPtr = (ushort *)ptr; * numPtr = str1.Length * 2 < (int)ushort.MaxValue ? (ushort)(str1.Length * 2) : ushort.MaxValue; mofField->DataPointer = (void *)numPtr; offSet += 2U; } return(str1); } if (data is sbyte) { mofField->DataLength = 1U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)3; } sbyte *numPtr = (sbyte *)ptr; * numPtr = (sbyte)data; mofField->DataPointer = (void *)numPtr; ++offSet; } else if (data is byte) { mofField->DataLength = 1U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)4; } byte *numPtr = (byte *)ptr; * numPtr = (byte)data; mofField->DataPointer = (void *)numPtr; ++offSet; } else if (data is short) { mofField->DataLength = 2U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)5; } short *numPtr = (short *)ptr; * numPtr = (short)data; mofField->DataPointer = (void *)numPtr; offSet += 2U; } else if (data is ushort) { mofField->DataLength = 2U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)6; } ushort *numPtr = (ushort *)ptr; * numPtr = (ushort)data; mofField->DataPointer = (void *)numPtr; offSet += 2U; } else if (data is int) { mofField->DataLength = 4U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)7; } int *numPtr = (int *)ptr; * numPtr = (int)data; mofField->DataPointer = (void *)numPtr; offSet += 4U; } else if (data is uint) { mofField->DataLength = 4U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)8; } uint *numPtr = (uint *)ptr; * numPtr = (uint)data; mofField->DataPointer = (void *)numPtr; offSet += 4U; } else if (data is long) { mofField->DataLength = 8U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)9; } long *numPtr = (long *)ptr; * numPtr = (long)data; mofField->DataPointer = (void *)numPtr; offSet += 8U; } else if (data is ulong) { mofField->DataLength = 8U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)10; } ulong *numPtr = (ulong *)ptr; * numPtr = (ulong)data; mofField->DataPointer = (void *)numPtr; offSet += 8U; } else if (data is char) { mofField->DataLength = 2U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)11; } char *chPtr = ptr; * chPtr = (char)data; mofField->DataPointer = (void *)chPtr; offSet += 2U; } else if (data is float) { mofField->DataLength = 4U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)12; } float *numPtr = (float *)ptr; * numPtr = (float)data; mofField->DataPointer = (void *)numPtr; offSet += 4U; } else if (data is double) { mofField->DataLength = 8U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)13; } double *numPtr = (double *)ptr; * numPtr = (double)data; mofField->DataPointer = (void *)numPtr; offSet += 8U; } else if (data is bool) { mofField->DataLength = 1U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)14; } bool *flagPtr = (bool *)ptr; * flagPtr = (bool)data; mofField->DataPointer = (void *)flagPtr; ++offSet; } else if (data is Decimal) { mofField->DataLength = 16U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)15; } Decimal *numPtr = (Decimal *)ptr; * numPtr = (Decimal)data; mofField->DataPointer = (void *)numPtr; offSet += 16U; } else if (data.GetType().IsEnum) { mofField->DataLength = 8U; if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)9; } long *numPtr = (long *)ptr; * numPtr = Convert.ToInt64(data); mofField->DataPointer = (void *)numPtr; offSet += 8U; } else { string str2 = data.ToString(); if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *ptrArgInfo = (byte)2; *(short *)(ptrArgInfo + 1) = str2.Length < (int)ushort.MaxValue ? (short)(ushort)str2.Length : (short)-1; } else { mofField->DataLength = 2U; ushort *numPtr = (ushort *)ptr; * numPtr = str2.Length * 2 < (int)ushort.MaxValue ? (ushort)(str2.Length * 2) : ushort.MaxValue; mofField->DataPointer = (void *)numPtr; offSet += 2U; } return(str2); } if ((IntPtr)ptrArgInfo != IntPtr.Zero) { *(short *)(ptrArgInfo + 1) = (short)(ushort)mofField->DataLength; } return(str1); }