Skip to content

Commit e484b59

Browse files
committed
fix: resolve stack overflow in noncentral_f and Int64 test mismatches
- Fix circular delegation in np.random.noncentral_f: params long[] now has the implementation instead of delegating to Shape (which delegated back) - Fix np.random.f params long[] to delegate to int[] instead of Shape - Update np.split tests to use ToArray<long>() for np.arange results (np.arange now returns Int64 in longindexing branch) - Fix Split_ReturnsViews test to use Get/SetInt64 instead of Int32
1 parent 1e82e79 commit e484b59

3 files changed

Lines changed: 36 additions & 33 deletions

File tree

src/NumSharp.Core/RandomSampling/np.random.f.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public NDArray f(double dfnum, double dfden, int[] size)
9292
/// <returns>Drawn samples from the F distribution.</returns>
9393
/// <exception cref="ArgumentException">If dfnum or dfden is <= 0.</exception>
9494
public NDArray f(double dfnum, double dfden, params long[] size)
95-
=> f(dfnum, dfden, new Shape(size));
95+
=> f(dfnum, dfden, Array.ConvertAll(size, d => (int)d));
9696

9797
/// <summary>
9898
/// Generate a single sample from the F distribution.

src/NumSharp.Core/RandomSampling/np.random.noncentral_f.cs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ public NDArray noncentral_f(double dfnum, double dfden, double nonc, Shape size)
3737
/// https://numpy.org/doc/stable/reference/random/generated/numpy.random.noncentral_f.html
3838
/// </remarks>
3939
public NDArray noncentral_f(double dfnum, double dfden, double nonc, int[] size)
40+
=> noncentral_f(dfnum, dfden, nonc, Shape.ComputeLongShape(size));
41+
42+
/// <summary>
43+
/// Draw samples from the noncentral F distribution.
44+
/// </summary>
45+
/// <param name="dfnum">Numerator degrees of freedom, must be > 0.</param>
46+
/// <param name="dfden">Denominator degrees of freedom, must be > 0.</param>
47+
/// <param name="nonc">Non-centrality parameter, must be >= 0.</param>
48+
/// <param name="size">Output shape.</param>
49+
/// <returns>Drawn samples from the parameterized noncentral F distribution.</returns>
50+
/// <remarks>
51+
/// https://numpy.org/doc/stable/reference/random/generated/numpy.random.noncentral_f.html
52+
/// </remarks>
53+
public NDArray noncentral_f(double dfnum, double dfden, double nonc, params long[] size)
4054
{
4155
// Parameter validation (matches NumPy error messages)
4256
if (dfnum <= 0)
@@ -51,30 +65,19 @@ public NDArray noncentral_f(double dfnum, double dfden, double nonc, int[] size)
5165
return NDArray.Scalar(SampleNoncentralF(dfnum, dfden, nonc));
5266
}
5367

54-
var result = new NDArray<double>(size);
55-
ArraySlice<double> resultArray = result.Data<double>();
68+
var shape = new Shape(size);
69+
var result = new NDArray(NPTypeCode.Double, shape, false);
5670

57-
for (int i = 0; i < result.size; ++i)
58-
resultArray[i] = SampleNoncentralF(dfnum, dfden, nonc);
71+
unsafe
72+
{
73+
var addr = (double*)result.Address;
74+
for (long i = 0; i < result.size; ++i)
75+
addr[i] = SampleNoncentralF(dfnum, dfden, nonc);
76+
}
5977

60-
result.ReplaceData(resultArray);
6178
return result;
6279
}
6380

64-
/// <summary>
65-
/// Draw samples from the noncentral F distribution.
66-
/// </summary>
67-
/// <param name="dfnum">Numerator degrees of freedom, must be > 0.</param>
68-
/// <param name="dfden">Denominator degrees of freedom, must be > 0.</param>
69-
/// <param name="nonc">Non-centrality parameter, must be >= 0.</param>
70-
/// <param name="size">Output shape.</param>
71-
/// <returns>Drawn samples from the parameterized noncentral F distribution.</returns>
72-
/// <remarks>
73-
/// https://numpy.org/doc/stable/reference/random/generated/numpy.random.noncentral_f.html
74-
/// </remarks>
75-
public NDArray noncentral_f(double dfnum, double dfden, double nonc, params long[] size)
76-
=> noncentral_f(dfnum, dfden, nonc, new Shape(size));
77-
7881
/// <summary>
7982
/// Sample a single value from the noncentral F distribution.
8083
/// </summary>

test/NumSharp.UnitTest/Manipulation/np.split.Tests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ public void Split_1D_EqualParts()
2121
var result = np.split(a, 3);
2222

2323
result.Length.Should().Be(3);
24-
result[0].ToArray<int>().Should().ContainInOrder(0, 1, 2);
25-
result[1].ToArray<int>().Should().ContainInOrder(3, 4, 5);
26-
result[2].ToArray<int>().Should().ContainInOrder(6, 7, 8);
24+
result[0].ToArray<long>().Should().ContainInOrder(0, 1, 2);
25+
result[1].ToArray<long>().Should().ContainInOrder(3, 4, 5);
26+
result[2].ToArray<long>().Should().ContainInOrder(6, 7, 8);
2727
}
2828

2929
[Test]
@@ -61,12 +61,12 @@ public void Split_2D_Axis1()
6161
result[1].Should().BeShaped(3, 2);
6262

6363
// First result: columns 0-1
64-
result[0]["0, :"].ToArray<int>().Should().ContainInOrder(0, 1);
65-
result[0]["1, :"].ToArray<int>().Should().ContainInOrder(4, 5);
64+
result[0]["0, :"].ToArray<long>().Should().ContainInOrder(0, 1);
65+
result[0]["1, :"].ToArray<long>().Should().ContainInOrder(4, 5);
6666

6767
// Second result: columns 2-3
68-
result[1]["0, :"].ToArray<int>().Should().ContainInOrder(2, 3);
69-
result[1]["1, :"].ToArray<int>().Should().ContainInOrder(6, 7);
68+
result[1]["0, :"].ToArray<long>().Should().ContainInOrder(2, 3);
69+
result[1]["1, :"].ToArray<long>().Should().ContainInOrder(6, 7);
7070
}
7171

7272
[Test]
@@ -96,10 +96,10 @@ public void Split_WithIndices()
9696
var result = np.split(a, new[] { 3, 5, 7 });
9797

9898
result.Length.Should().Be(4);
99-
result[0].ToArray<int>().Should().ContainInOrder(0, 1, 2);
100-
result[1].ToArray<int>().Should().ContainInOrder(3, 4);
101-
result[2].ToArray<int>().Should().ContainInOrder(5, 6);
102-
result[3].ToArray<int>().Should().ContainInOrder(7, 8);
99+
result[0].ToArray<long>().Should().ContainInOrder(0, 1, 2);
100+
result[1].ToArray<long>().Should().ContainInOrder(3, 4);
101+
result[2].ToArray<long>().Should().ContainInOrder(5, 6);
102+
result[3].ToArray<long>().Should().ContainInOrder(7, 8);
103103
}
104104

105105
[Test]
@@ -295,8 +295,8 @@ public void Split_ReturnsViews()
295295
var result = np.split(a, 3);
296296

297297
// Modifying a view should affect the original
298-
result[0].SetInt32(999, 0);
299-
a.GetInt32(0).Should().Be(999);
298+
result[0].SetInt64(999, 0);
299+
a.GetInt64(0).Should().Be(999);
300300
}
301301

302302
[Test]

0 commit comments

Comments
 (0)