Skip to content

Commit 639e705

Browse files
committed
Add AggregateChecked and a vectorized SumChecked
1 parent f7bde7f commit 639e705

File tree

6 files changed

+446
-9
lines changed

6 files changed

+446
-9
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using System.Numerics.Tensors;
2+
3+
namespace NetFabric.Numerics.Tensors.UnitTests;
4+
5+
public class SumCheckedTests
6+
{
7+
public static TheoryData<int[]> SumCheckedOverflowData
8+
=> new() {
9+
new[] { int.MaxValue, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
10+
new[] { 1, int.MaxValue, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
11+
new[] { 1, 1, int.MaxValue, 1, 1, 1, 1, 1, 1, 1, 1 },
12+
new[] { 1, 1, 1, int.MaxValue, 1, 1, 1, 1, 1, 1, 1 },
13+
new[] { 1, 1, 1, 1, int.MaxValue, 1, 1, 1, 1, 1, 1 },
14+
new[] { 1, 1, 1, 1, 1, int.MaxValue, 1, 1, 1, 1, 1 },
15+
new[] { 1, 1, 1, 1, 1, 1, int.MaxValue, 1, 1, 1, 1 },
16+
new[] { 1, 1, 1, 1, 1, 1, 1, int.MaxValue, 1, 1, 1 },
17+
};
18+
19+
[Theory]
20+
[MemberData(nameof(SumCheckedOverflowData))]
21+
public static void SumChecked_With_Overflow_Should_Throw(int[] source)
22+
{
23+
// arrange
24+
25+
// act
26+
void action() => TensorOperations.SumChecked<int>(source);
27+
28+
// assert
29+
_ = Assert.Throws<OverflowException>(action);
30+
}
31+
32+
public static TheoryData<int> SumCheckedData
33+
=> new() {
34+
{ 0 }, { 1 }, { 2 }, { 3 }, { 4 }, { 5 }, { 6 }, { 7 }, { 8 }, { 9 }, { 10 }, { 100 },
35+
};
36+
37+
static void SumChecked_Should_Succeed<T>(int count)
38+
where T : struct, INumber<T>
39+
{
40+
// arrange
41+
var source = new T[count];
42+
var expected = T.Zero;
43+
var random = new Random(42);
44+
for (var index = 0; index < source.Length; index++)
45+
{
46+
var value = T.CreateChecked(random.Next(10));
47+
source[index] = value;
48+
expected += value;
49+
}
50+
51+
// act
52+
var result = TensorOperations.SumChecked<T>(source);
53+
54+
// assert
55+
Assert.Equal(expected, result);
56+
}
57+
58+
[Theory]
59+
[MemberData(nameof(SumCheckedData))]
60+
public void SumChecked_Short_Should_Succeed(int count)
61+
=> SumChecked_Should_Succeed<short>(count);
62+
63+
[Theory]
64+
[MemberData(nameof(SumCheckedData))]
65+
public void SumChecked_Int_Should_Succeed(int count)
66+
=> SumChecked_Should_Succeed<int>(count);
67+
68+
[Theory]
69+
[MemberData(nameof(SumCheckedData))]
70+
public void SumChecked_Long_Should_Succeed(int count)
71+
=> SumChecked_Should_Succeed<long>(count);
72+
73+
[Theory]
74+
[MemberData(nameof(SumCheckedData))]
75+
public void SumChecked_Half_Should_Succeed(int count)
76+
=> SumChecked_Should_Succeed<Half>(count);
77+
78+
[Theory]
79+
[MemberData(nameof(SumCheckedData))]
80+
public void SumChecked_Float_Should_Succeed(int count)
81+
=> SumChecked_Should_Succeed<float>(count);
82+
83+
[Theory]
84+
[MemberData(nameof(SumCheckedData))]
85+
public void SumChecked_Double_Should_Succeed(int count)
86+
=> SumChecked_Should_Succeed<double>(count);
87+
}

0 commit comments

Comments
 (0)