Browse Source

LA: Vector MapInplace implemented at storage level

build
Christoph Ruegg 10 years ago
parent
commit
ae31d3a7b5
  1. 26
      src/Numerics/LinearAlgebra/Storage/DenseVectorStorage.cs
  2. 72
      src/Numerics/LinearAlgebra/Storage/SparseVectorStorage.cs
  3. 20
      src/Numerics/LinearAlgebra/Storage/VectorStorage.cs
  4. 12
      src/Numerics/LinearAlgebra/Vector.cs

26
src/Numerics/LinearAlgebra/Storage/DenseVectorStorage.cs

@ -436,7 +436,29 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
return base.Find2Unchecked(other, predicate, zeros);
}
// FUNCTIONAL COMBINATORS
// FUNCTIONAL COMBINATORS: MAP
public override void MapInplace(Func<T, T> f, Zeros zeros = Zeros.AllowSkip)
{
CommonParallel.For(0, Data.Length, 4096, (a, b) =>
{
for (int i = a; i < b; i++)
{
Data[i] = f(Data[i]);
}
});
}
public override void MapIndexedInplace(Func<int, T, T> f, Zeros zeros = Zeros.AllowSkip)
{
CommonParallel.For(0, Data.Length, 4096, (a, b) =>
{
for (int i = a; i < b; i++)
{
Data[i] = f(i, Data[i]);
}
});
}
internal override void MapToUnchecked<TU>(VectorStorage<TU> target, Func<T, TU> f, Zeros zeros, ExistingData existingData)
{
@ -539,6 +561,8 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
base.Map2ToUnchecked(target, other, f, zeros, existingData);
}
// FUNCTIONAL COMBINATORS: FOLD
internal override TState Fold2Unchecked<TOther, TState>(VectorStorage<TOther> other, Func<TState, T, TOther, TState> f, TState state, Zeros zeros)
{
var denseOther = other as DenseVectorStorage<TOther>;

72
src/Numerics/LinearAlgebra/Storage/SparseVectorStorage.cs

@ -774,7 +774,75 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
return base.Find2Unchecked(other, predicate, zeros);
}
// FUNCTIONAL COMBINATORS
// FUNCTIONAL COMBINATORS: MAP
public override void MapInplace(Func<T, T> f, Zeros zeros = Zeros.AllowSkip)
{
var indices = new List<int>();
var values = new List<T>(ValueCount);
if (zeros == Zeros.Include || !Zero.Equals(f(Zero)))
{
int k = 0;
for (int i = 0; i < Length; i++)
{
var item = k < ValueCount && (Indices[k]) == i ? f(Values[k++]) : f(Zero);
if (!Zero.Equals(item))
{
values.Add(item);
indices.Add(i);
}
}
}
else
{
for (int i = 0; i < ValueCount; i++)
{
var item = f(Values[i]);
if (!Zero.Equals(item))
{
values.Add(item);
indices.Add(Indices[i]);
}
}
}
Indices = indices.ToArray();
Values = values.ToArray();
ValueCount = values.Count;
}
public override void MapIndexedInplace(Func<int, T, T> f, Zeros zeros = Zeros.AllowSkip)
{
var indices = new List<int>();
var values = new List<T>(ValueCount);
if (zeros == Zeros.Include)
{
int k = 0;
for (int i = 0; i < Length; i++)
{
var item = k < ValueCount && (Indices[k]) == i ? f(i, Values[k++]) : f(i, Zero);
if (!Zero.Equals(item))
{
values.Add(item);
indices.Add(i);
}
}
}
else
{
for (int i = 0; i < ValueCount; i++)
{
var item = f(Indices[i], Values[i]);
if (!Zero.Equals(item))
{
values.Add(item);
indices.Add(Indices[i]);
}
}
}
Indices = indices.ToArray();
Values = values.ToArray();
ValueCount = values.Count;
}
internal override void MapToUnchecked<TU>(VectorStorage<TU> target, Func<T, TU> f, Zeros zeros, ExistingData existingData)
{
@ -1074,6 +1142,8 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
base.Map2ToUnchecked(target, other, f, zeros, existingData);
}
// FUNCTIONAL COMBINATORS: MAP
internal override TState Fold2Unchecked<TOther, TState>(VectorStorage<TOther> other, Func<TState, T, TOther, TState> f, TState state, Zeros zeros)
{
var sparseOther = other as SparseVectorStorage<TOther>;

20
src/Numerics/LinearAlgebra/Storage/VectorStorage.cs

@ -479,7 +479,23 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
return null;
}
// FUNCTIONAL COMBINATORS
// FUNCTIONAL COMBINATORS: MAP
public virtual void MapInplace(Func<T, T> f, Zeros zeros = Zeros.AllowSkip)
{
for (int i = 0; i < Length; i++)
{
At(i, f(At(i)));
}
}
public virtual void MapIndexedInplace(Func<int, T, T> f, Zeros zeros = Zeros.AllowSkip)
{
for (int i = 0; i < Length; i++)
{
At(i, f(i, At(i)));
}
}
public void MapTo<TU>(VectorStorage<TU> target, Func<T, TU> f,
Zeros zeros = Zeros.AllowSkip, ExistingData existingData = ExistingData.Clear)
@ -567,6 +583,8 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
// FUNCTIONAL COMBINATORS: FOLD
public TState Fold2<TOther, TState>(VectorStorage<TOther> other, Func<TState, T, TOther, TState> f, TState state, Zeros zeros = Zeros.AllowSkip)
where TOther : struct, IEquatable<TOther>, IFormattable
{

12
src/Numerics/LinearAlgebra/Vector.cs

@ -350,8 +350,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// </summary>
public void MapInplace(Func<T, T> f, Zeros zeros = Zeros.AllowSkip)
{
// TODO: actual in-place
Storage.MapToUnchecked(Storage, f, zeros, ExistingData.AssumeZeros);
Storage.MapInplace(f, zeros);
}
/// <summary>
@ -362,8 +361,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// </summary>
public void MapIndexedInplace(Func<int, T, T> f, Zeros zeros = Zeros.AllowSkip)
{
// TODO: actual in-place
Storage.MapIndexedToUnchecked(Storage, f, zeros, ExistingData.AssumeZeros);
Storage.MapIndexedInplace(f, zeros);
}
/// <summary>
@ -375,8 +373,7 @@ namespace MathNet.Numerics.LinearAlgebra
{
if (ReferenceEquals(this, result))
{
// TODO: actual in-place
Storage.MapToUnchecked(Storage, f, zeros, ExistingData.AssumeZeros);
Storage.MapInplace(f, zeros);
}
else
{
@ -394,8 +391,7 @@ namespace MathNet.Numerics.LinearAlgebra
{
if (ReferenceEquals(this, result))
{
// TODO: actual in-place
Storage.MapIndexedToUnchecked(Storage, f, zeros, ExistingData.AssumeZeros);
Storage.MapIndexedInplace(f, zeros);
}
else
{

Loading…
Cancel
Save