Browse Source

Merge pull request #426 from Aixile/master

Fix recursion issue of CacheObliviousMatrixMultiply
netstandard
Christoph Ruegg 10 years ago
committed by GitHub
parent
commit
c8d3b272ba
  1. 2
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex.cs
  2. 2
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex32.cs
  3. 64
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Double.cs
  4. 2
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Single.cs

2
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex.cs

@ -666,7 +666,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
/// <param name="first">Indicates if this is the first recursion.</param> /// <param name="first">Indicates if this is the first recursion.</param>
static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, Complex alpha, Complex[] matrixA, int shiftArow, int shiftAcol, Complex[] matrixB, int shiftBrow, int shiftBcol, Complex[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first) static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, Complex alpha, Complex[] matrixA, int shiftArow, int shiftAcol, Complex[] matrixB, int shiftBrow, int shiftBcol, Complex[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first)
{ {
if (m + n <= Control.ParallelizeOrder) if (m + n <= Control.ParallelizeOrder || m == 1 || n == 1 || k == 1)
{ {
if ((int) transposeA > 111 && (int) transposeB > 111) if ((int) transposeA > 111 && (int) transposeB > 111)
{ {

2
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex32.cs

@ -663,7 +663,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
/// <param name="first">Indicates if this is the first recursion.</param> /// <param name="first">Indicates if this is the first recursion.</param>
static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, Complex32 alpha, Complex32[] matrixA, int shiftArow, int shiftAcol, Complex32[] matrixB, int shiftBrow, int shiftBcol, Complex32[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first) static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, Complex32 alpha, Complex32[] matrixA, int shiftArow, int shiftAcol, Complex32[] matrixB, int shiftBrow, int shiftBcol, Complex32[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first)
{ {
if (m + n <= Control.ParallelizeOrder) if (m + n <= Control.ParallelizeOrder || m == 1 || n == 1 || k == 1)
{ {
if ((int) transposeA > 111 && (int) transposeB > 111) if ((int) transposeA > 111 && (int) transposeB > 111)
{ {

64
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Double.cs

@ -175,7 +175,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
for (var index = 0; index < y.Length; index++) for (var index = 0; index < y.Length; index++)
{ {
sum += y[index]*x[index]; sum += y[index] * x[index];
} }
return sum; return sum;
@ -366,7 +366,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
var s = 0.0; var s = 0.0;
for (var i = 0; i < rows; i++) for (var i = 0; i < rows; i++)
{ {
s += Math.Abs(matrix[(j*rows) + i]); s += Math.Abs(matrix[(j * rows) + i]);
} }
norm1 = Math.Max(norm1, s); norm1 = Math.Max(norm1, s);
} }
@ -383,25 +383,25 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
return normMax; return normMax;
case Norm.InfinityNorm: case Norm.InfinityNorm:
var r = new double[rows]; var r = new double[rows];
for (var j = 0; j < columns; j++) for (var j = 0; j < columns; j++)
{ {
for (var i = 0; i < rows; i++) for (var i = 0; i < rows; i++)
{ {
r[i] += Math.Abs(matrix[(j * rows) + i]); r[i] += Math.Abs(matrix[(j * rows) + i]);
} }
} }
// TODO: reuse // TODO: reuse
var max = r[0]; var max = r[0];
for (int i = 0; i < r.Length; i++) for (int i = 0; i < r.Length; i++)
{ {
if (r[i] > max) if (r[i] > max)
{ {
max = r[i]; max = r[i];
} }
} }
return max; return max;
case Norm.FrobeniusNorm: case Norm.FrobeniusNorm:
var aat = new double[rows*rows]; var aat = new double[rows * rows];
MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.Transpose, 1.0, matrix, rows, columns, matrix, rows, columns, 0.0, aat); MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.Transpose, 1.0, matrix, rows, columns, matrix, rows, columns, 0.0, aat);
var normF = 0d; var normF = 0d;
for (var i = 0; i < rows; i++) for (var i = 0; i < rows; i++)
@ -444,12 +444,12 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
throw new ArgumentNullException("result"); throw new ArgumentNullException("result");
} }
if (rowsX*columnsX != x.Length) if (rowsX * columnsX != x.Length)
{ {
throw new ArgumentException("x.Length != xRows * xColumns"); throw new ArgumentException("x.Length != xRows * xColumns");
} }
if (rowsY*columnsY != y.Length) if (rowsY * columnsY != y.Length)
{ {
throw new ArgumentException("y.Length != yRows * yColumns"); throw new ArgumentException("y.Length != yRows * yColumns");
} }
@ -459,7 +459,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
throw new ArgumentException("xColumns != yRows"); throw new ArgumentException("xColumns != yRows");
} }
if (rowsX*columnsY != result.Length) if (rowsX * columnsY != result.Length)
{ {
throw new ArgumentException("xRows * yColumns != result.Length"); throw new ArgumentException("xRows * yColumns != result.Length");
} }
@ -470,7 +470,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
double[] xdata; double[] xdata;
if (ReferenceEquals(x, result)) if (ReferenceEquals(x, result))
{ {
xdata = (double[]) x.Clone(); xdata = (double[])x.Clone();
} }
else else
{ {
@ -480,7 +480,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
double[] ydata; double[] ydata;
if (ReferenceEquals(y, result)) if (ReferenceEquals(y, result))
{ {
ydata = (double[]) y.Clone(); ydata = (double[])y.Clone();
} }
else else
{ {
@ -523,14 +523,14 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
throw new ArgumentNullException("b"); throw new ArgumentNullException("b");
} }
if ((int) transposeA > 111 && (int) transposeB > 111) if ((int)transposeA > 111 && (int)transposeB > 111)
{ {
if (rowsA != columnsB) if (rowsA != columnsB)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
if (columnsA*rowsB != c.Length) if (columnsA * rowsB != c.Length)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
@ -539,14 +539,14 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
n = rowsB; n = rowsB;
k = rowsA; k = rowsA;
} }
else if ((int) transposeA > 111) else if ((int)transposeA > 111)
{ {
if (rowsA != rowsB) if (rowsA != rowsB)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
if (columnsA*columnsB != c.Length) if (columnsA * columnsB != c.Length)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
@ -555,14 +555,14 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
n = columnsB; n = columnsB;
k = rowsA; k = rowsA;
} }
else if ((int) transposeB > 111) else if ((int)transposeB > 111)
{ {
if (columnsA != columnsB) if (columnsA != columnsB)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
if (rowsA*rowsB != c.Length) if (rowsA * rowsB != c.Length)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
@ -578,7 +578,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
if (rowsA*columnsB != c.Length) if (rowsA * columnsB != c.Length)
{ {
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
@ -600,7 +600,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
double[] adata; double[] adata;
if (ReferenceEquals(a, c)) if (ReferenceEquals(a, c))
{ {
adata = (double[]) a.Clone(); adata = (double[])a.Clone();
} }
else else
{ {
@ -610,7 +610,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
double[] bdata; double[] bdata;
if (ReferenceEquals(b, c)) if (ReferenceEquals(b, c))
{ {
bdata = (double[]) b.Clone(); bdata = (double[])b.Clone();
} }
else else
{ {
@ -658,7 +658,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
/// <param name="first">Indicates if this is the first recursion.</param> /// <param name="first">Indicates if this is the first recursion.</param>
static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, double alpha, double[] matrixA, int shiftArow, int shiftAcol, double[] matrixB, int shiftBrow, int shiftBcol, double[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first) static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, double alpha, double[] matrixA, int shiftArow, int shiftAcol, double[] matrixB, int shiftBrow, int shiftBcol, double[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first)
{ {
if (m + n <= Control.ParallelizeOrder) if (m + n <= Control.ParallelizeOrder || m == 1 || n == 1 || k == 1)
{ {
if ((int) transposeA > 111 && (int) transposeB > 111) if ((int) transposeA > 111 && (int) transposeB > 111)
{ {

2
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Single.cs

@ -658,7 +658,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
/// <param name="first">Indicates if this is the first recursion.</param> /// <param name="first">Indicates if this is the first recursion.</param>
static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, float alpha, float[] matrixA, int shiftArow, int shiftAcol, float[] matrixB, int shiftBrow, int shiftBcol, float[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first) static void CacheObliviousMatrixMultiply(Transpose transposeA, Transpose transposeB, float alpha, float[] matrixA, int shiftArow, int shiftAcol, float[] matrixB, int shiftBrow, int shiftBcol, float[] result, int shiftCrow, int shiftCcol, int m, int n, int k, int constM, int constN, int constK, bool first)
{ {
if (m + n <= Control.ParallelizeOrder) if (m + n <= Control.ParallelizeOrder || m == 1 || n == 1 || k == 1)
{ {
if ((int) transposeA > 111 && (int) transposeB > 111) if ((int) transposeA > 111 && (int) transposeB > 111)
{ {

Loading…
Cancel
Save