private static void CalculatePartialDerivatives(float[][] dedy, float[][] d2edy2, float[][] dds, float[][] yds, float[][] ys) { var c = 0.0f; Parallel.For(0, ys.Length, row => { var slots = Vector <float> .Count; var accum = Vector <float> .Zero; var col = row + 1; for (; col + slots < ys[row].Length - row; ++col) { var v = new Vector <float>(dds[row], col); accum += v; } c += Vector.Dot(accum, Vector <float> .One); for (; col < ys[row].Length; ++col) { c += dds[row][col]; } }); Parallel.For(0, ys.Length, i => { var ysColumns = new float[ys[0].Length][]; for (var k = 0; k < ys[0].Length; ++k) { ysColumns[k] = JaggedArray.GetColumn(ys, k); } for (var j = 0; j < ys[i].Length; ++j) { var slots = Vector <float> .Count; var dedyAccum = Vector <float> .Zero; var d2edy2Accum = Vector <float> .Zero; var dedySum = 0.0f; var d2edy2Sum = 0.0f; var s = 0; for (; s + slots < ys.Length; s += slots) { var dis = new Vector <float>(dds[i], s); var disStar = new Vector <float>(yds[i], s); var yij = new Vector <float>(ys[i][j]); var ysj = new Vector <float>(ysColumns[j], s); var disMinusDisStar = dis - disStar; var disMulDisStar = dis * disStar; var yijMinusYsj = yij - ysj; var one = Vector <float> .One; dedyAccum += disMinusDisStar / disMulDisStar * yijMinusYsj; d2edy2Accum += one / disMulDisStar * ( disMinusDisStar - (yijMinusYsj * yijMinusYsj) / disStar * (one + disMinusDisStar / dis) ); } dedySum += Vector.Dot(dedyAccum, Vector <float> .One); d2edy2Sum += Vector.Dot(d2edy2Accum, Vector <float> .One); for (; s < ys.Length; ++s) { var disMinusDisStar = dds[i][s] - yds[i][s]; var disMulDisStar = dds[i][s] * yds[i][s]; var yijMinusYsj = ys[i][j] - ys[s][j]; var one = 1.0f; dedySum += disMinusDisStar / disMulDisStar * yijMinusYsj; d2edy2Sum += one / disMulDisStar * ( disMinusDisStar - (yijMinusYsj * yijMinusYsj) / yds[i][s] * (one + disMinusDisStar / dds[i][s]) ); } dedy[i][j] = dedySum * -2.0f / c; d2edy2[i][j] = d2edy2Sum * -2.0f / c; } ; }); }