Browse Source

Bug fixes in the unit tests for the new functional friendly API.

Typo fix: Sparce -> Sparse
la-knuth
Jurgen Van Gael 16 years ago
parent
commit
9f1461aa5b
  1. 90
      src/Numerics/LinearAlgebra/Double/DenseVector.cs
  2. 50
      src/Numerics/LinearAlgebra/Double/SparseVector.cs
  3. 61
      src/Numerics/LinearAlgebra/Double/Vector.cs
  4. 12
      src/UnitTests/LinearAlgebraTests/Double/VectorTests.Arithmetic.cs

90
src/Numerics/LinearAlgebra/Double/DenseVector.cs

@ -333,8 +333,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentException(Resources.ArgumentVectorsSameLength, "result"); throw new ArgumentException(Resources.ArgumentVectorsSameLength, "result");
} }
CopyTo(result); var dense = result as DenseVector;
result.Add(scalar); if (dense == null)
{
base.Add(scalar, result);
}
else
{
CommonParallel.For(
0,
Data.Length,
index => dense.Data[index] = this.Data[index] + scalar);
}
} }
/// <summary> /// <summary>
@ -398,14 +408,25 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.Add(other);
Add(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
{ {
CopyTo(result); var rdense = result as DenseVector;
result.Add(other); var odense = other as DenseVector;
if (rdense != null && odense != null)
{
CopyTo(result);
Control.LinearAlgebraProvider.AddVectorToScaledVector(rdense.Data, 1.0, odense.Data);
}
else
{
CommonParallel.For(
0,
Data.Length,
index => result[index] = this.Data[index] + other[index]);
}
} }
} }
@ -451,9 +472,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide"); throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide");
} }
var ret = leftSide.Clone(); return leftSide.Add(rightSide);
ret.Add(rightSide);
return ret;
} }
/// <summary> /// <summary>
@ -495,8 +514,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentException(Resources.ArgumentVectorsSameLength, "result"); throw new ArgumentException(Resources.ArgumentVectorsSameLength, "result");
} }
CopyTo(result); var dense = result as DenseVector;
result.Subtract(scalar); if (dense == null)
{
base.Add(scalar, result);
}
else
{
CommonParallel.For(
0,
Data.Length,
index => dense.Data[index] = this.Data[index] - scalar);
}
} }
/// <summary> /// <summary>
@ -712,9 +741,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentNullException("rightSide"); throw new ArgumentNullException("rightSide");
} }
var ret = (DenseVector)rightSide.Clone(); return (DenseVector) rightSide.Multiply(leftSide);
ret.Multiply(leftSide);
return ret;
} }
/// <summary> /// <summary>
@ -759,9 +786,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentNullException("leftSide"); throw new ArgumentNullException("leftSide");
} }
var ret = (DenseVector)leftSide.Clone(); return (DenseVector) leftSide.Multiply(1.0 / rightSide);
ret.Multiply(1.0 / rightSide);
return ret;
} }
/// <summary> /// <summary>
@ -1030,8 +1055,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double
} }
else else
{ {
CopyTo(result); var dense = result as DenseVector;
result.PointwiseMultiply(other); if (dense == null)
{
base.PointwiseMultiply(other, result);
}
else
{
CommonParallel.For(
0,
Data.Length,
index => dense.Data[index] = this.Data[index] * other[index]);
}
} }
} }
@ -1104,14 +1139,23 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.PointwiseDivide(other);
PointwiseDivide(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
{ {
CopyTo(result); var dense = result as DenseVector;
result.PointwiseDivide(other); if (dense == null)
{
base.PointwiseDivide(other, result);
}
else
{
CommonParallel.For(
0,
Data.Length,
index => dense.Data[index] = this.Data[index] / other[index]);
}
} }
} }

50
src/Numerics/LinearAlgebra/Double/SparseVector.cs

@ -413,7 +413,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
else else
{ {
var copy = (SparseVector)this.Clone(); var copy = (SparseVector)this.Clone();
copy.AddScaledSparceVector(1.0, sparseVector); copy.AddScaledSparseVector(1.0, sparseVector);
return copy; return copy;
} }
} }
@ -423,7 +423,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </summary> /// </summary>
/// <param name="alpha">The alpha.</param> /// <param name="alpha">The alpha.</param>
/// <param name="other">The other.</param> /// <param name="other">The other.</param>
private void AddScaledSparceVector(double alpha, SparseVector other) private void AddScaledSparseVector(double alpha, SparseVector other)
{ {
if (other == null) if (other == null)
{ {
@ -515,14 +515,28 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.Add(other);
Add(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
{ {
CopyTo(result); var sparse = result as SparseVector;
result.Add(other); if (sparse == null)
{
base.Add(other, result);
}
else
{
var sparseother = other as SparseVector;
if (sparseother == null)
{
sparse.AddScaledSparseVector(1.0, sparseother);
}
else
{
base.Add(other, result);
}
}
} }
} }
@ -644,7 +658,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
else else
{ {
var copy = (SparseVector)this.Clone(); var copy = (SparseVector)this.Clone();
copy.AddScaledSparceVector(-1.0, sparseVector); copy.AddScaledSparseVector(-1.0, sparseVector);
return copy; return copy;
} }
} }
@ -677,14 +691,28 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.Subtract(other);
Subtract(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
{ {
CopyTo(result); var sparse = result as SparseVector;
result.Subtract(other); if (sparse == null)
{
base.Subtract(other, result);
}
else
{
var sparseother = other as SparseVector;
if (sparseother == null)
{
sparse.AddScaledSparseVector(-1.0, sparseother);
}
else
{
base.Subtract(other, result);
}
}
} }
} }

61
src/Numerics/LinearAlgebra/Double/Vector.cs

@ -168,7 +168,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(result); CopyTo(result);
} }
result.Add(scalar); CommonParallel.For(
0,
Count,
index => result[index] += scalar);
} }
/// <summary> /// <summary>
@ -182,7 +185,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </remarks> /// </remarks>
public virtual Vector Plus() public virtual Vector Plus()
{ {
return this * 1.0; return this.Clone();
} }
/// <summary> /// <summary>
@ -253,8 +256,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.Add(other);
Add(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
@ -318,7 +320,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(result); CopyTo(result);
} }
result.Subtract(scalar); CommonParallel.For(
0,
Count,
index => result[index] -= scalar);
} }
/// <summary> /// <summary>
@ -468,7 +473,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(result); CopyTo(result);
} }
result.Multiply(scalar); CommonParallel.For(
0,
Count,
index => result[index] *= scalar);
} }
/// <summary> /// <summary>
@ -556,7 +564,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(result); CopyTo(result);
} }
result.Multiply(1.0 / scalar); CommonParallel.For(
0,
Count,
index => result[index] /= scalar);
} }
/// <summary> /// <summary>
@ -619,14 +630,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.PointwiseMultiply(other);
PointwiseMultiply(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
{ {
CopyTo(result); CopyTo(result);
result.PointwiseMultiply(other); CommonParallel.For(
0,
Count,
index => result[index] *= other[index]);
} }
} }
@ -690,14 +703,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = result.CreateVector(result.Count); var tmp = this.PointwiseDivide(other);
PointwiseDivide(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
else else
{ {
CopyTo(result); CopyTo(result);
result.PointwiseDivide(other); CommonParallel.For(
0,
Count,
index => result[index] /= other[index]);
} }
} }
@ -994,9 +1009,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide"); throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide");
} }
var ret = leftSide.Clone(); return leftSide.Add(rightSide);
ret.Add(rightSide);
return ret;
} }
/// <summary> /// <summary>
@ -1040,9 +1053,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide"); throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide");
} }
var ret = leftSide.Clone(); return leftSide.Subtract(rightSide);
ret.Subtract(rightSide);
return ret;
} }
/// <summary> /// <summary>
@ -1059,9 +1070,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentNullException("leftSide"); throw new ArgumentNullException("leftSide");
} }
var ret = leftSide.Clone(); return leftSide.Multiply(rightSide);
ret.Multiply(rightSide);
return ret;
} }
/// <summary> /// <summary>
@ -1078,9 +1087,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentNullException("rightSide"); throw new ArgumentNullException("rightSide");
} }
var ret = rightSide.Clone(); return rightSide.Multiply(leftSide);
ret.Multiply(leftSide);
return ret;
} }
/// <summary> /// <summary>
@ -1125,9 +1132,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
throw new ArgumentNullException("leftSide"); throw new ArgumentNullException("leftSide");
} }
var ret = leftSide.Clone(); return leftSide.Multiply(1.0 / rightSide);
ret.Multiply(1.0 / rightSide);
return ret;
} }
#endregion #endregion

12
src/UnitTests/LinearAlgebraTests/Double/VectorTests.Arithmetic.cs

@ -37,7 +37,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
{ {
var vector = this.CreateVector(this._data); var vector = this.CreateVector(this._data);
var other = vector.Plus(); var other = vector.Plus();
Assert.AreSame(vector, other, "Should be the same vector");
for (var i = 0; i < this._data.Length; i++)
{
Assert.AreEqual(vector[i], other[i]);
}
} }
[Test] [Test]
@ -53,7 +57,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
{ {
var vector = this.CreateVector(this._data); var vector = this.CreateVector(this._data);
var other = +vector; var other = +vector;
Assert.AreSame(vector, other, "Should be the same vector");
for (var i = 0; i < this._data.Length; i++)
{
Assert.AreEqual(vector[i], other[i]);
}
} }
[Test] [Test]

Loading…
Cancel
Save