Skip to content

Commit c02b01b

Browse files
committed
Expose previously internal Series.Evaluate
1 parent 900b49f commit c02b01b

4 files changed

Lines changed: 109 additions & 32 deletions

File tree

build.fsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ Target "DocsWatch" (fun _ ->
385385
Target "CleanApi" (fun _ -> CleanDirs ["out/api"])
386386

387387
Target "Api" (fun _ ->
388-
!! "src/Numerics/bin/Release/net40/MathNet.Numerics.dll"
388+
!! "src/Numerics/bin/Release/net461/MathNet.Numerics.dll"
389389
|> Docu (fun p ->
390390
{ p with
391391
ToolPath = "tools/docu/docu.exe"

src/Numerics/Series.cs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// <copyright file="Series.cs" company="Math.NET">
2+
// Math.NET Numerics, part of the Math.NET Project
3+
// https://numerics.mathdotnet.com
4+
// https://github.com/mathnet/mathnet-numerics
5+
//
6+
// Copyright (c) 2009-2021 Math.NET
7+
//
8+
// Permission is hereby granted, free of charge, to any person
9+
// obtaining a copy of this software and associated documentation
10+
// files (the "Software"), to deal in the Software without
11+
// restriction, including without limitation the rights to use,
12+
// copy, modify, merge, publish, distribute, sublicense, and/or sell
13+
// copies of the Software, and to permit persons to whom the
14+
// Software is furnished to do so, subject to the following
15+
// conditions:
16+
//
17+
// The above copyright notice and this permission notice shall be
18+
// included in all copies or substantial portions of the Software.
19+
//
20+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21+
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
22+
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24+
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25+
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27+
// OTHER DEALINGS IN THE SOFTWARE.
28+
// </copyright>
29+
30+
using System;
31+
using System.Collections.Generic;
32+
33+
namespace MathNet.Numerics
34+
{
35+
public static class Series
36+
{
37+
/// <summary>
38+
/// Numerically stable series summation (stops automatically).
39+
/// </summary>
40+
/// <param name="nextSummand">provides the summands sequentially</param>
41+
/// <returns>Sum</returns>
42+
public static double Evaluate(Func<double> nextSummand)
43+
{
44+
double compensation = 0.0;
45+
double current;
46+
const double factor = 1 << 16;
47+
48+
double sum = nextSummand();
49+
50+
do
51+
{
52+
// Kahan Summation
53+
// NOTE (ruegg): do NOT optimize. Now, how to tell that the compiler?
54+
current = nextSummand();
55+
double y = current - compensation;
56+
double t = sum + y;
57+
compensation = t - sum;
58+
compensation -= y;
59+
sum = t;
60+
}
61+
while (Math.Abs(sum) < Math.Abs(factor*current));
62+
63+
return sum;
64+
}
65+
66+
/// <summary>
67+
/// Numerically stable series summation (stops automatically).
68+
/// </summary>
69+
/// <param name="infiniteSummands">provides the summands sequentially</param>
70+
/// <returns>Sum</returns>
71+
public static double Evaluate(IEnumerable<double> infiniteSummands)
72+
{
73+
double compensation = 0.0;
74+
double current, sum;
75+
const double factor = 1 << 16;
76+
77+
using (var enumerator = infiniteSummands.GetEnumerator())
78+
{
79+
if (!enumerator.MoveNext())
80+
{
81+
return 0.0;
82+
}
83+
84+
sum = enumerator.Current;
85+
if (!enumerator.MoveNext())
86+
{
87+
return sum;
88+
}
89+
90+
do
91+
{
92+
// Kahan Summation
93+
// NOTE (ruegg): do NOT optimize. Now, how to tell that the compiler?
94+
current = enumerator.Current;
95+
double y = current - compensation;
96+
double t = sum + y;
97+
compensation = t - sum;
98+
compensation -= y;
99+
sum = t;
100+
} while (Math.Abs(sum) < Math.Abs(factor * current) && enumerator.MoveNext());
101+
}
102+
103+
return sum;
104+
}
105+
}
106+
}

src/Numerics/SpecialFunctions/Evaluate.cs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -52,37 +52,8 @@ namespace MathNet.Numerics
5252
/// <summary>
5353
/// Evaluation functions, useful for function approximation.
5454
/// </summary>
55-
public static class Evaluate
55+
internal static class Evaluate
5656
{
57-
/// <summary>
58-
/// Numerically stable series summation
59-
/// </summary>
60-
/// <param name="nextSummand">provides the summands sequentially</param>
61-
/// <returns>Sum</returns>
62-
internal static double Series(Func<double> nextSummand)
63-
{
64-
double compensation = 0.0;
65-
double current;
66-
const double factor = 1 << 16;
67-
68-
double sum = nextSummand();
69-
70-
do
71-
{
72-
// Kahan Summation
73-
// NOTE (ruegg): do NOT optimize. Now, how to tell that the compiler?
74-
current = nextSummand();
75-
double y = current - compensation;
76-
double t = sum + y;
77-
compensation = t - sum;
78-
compensation -= y;
79-
sum = t;
80-
}
81-
while (Math.Abs(sum) < Math.Abs(factor*current));
82-
83-
return sum;
84-
}
85-
8657
/// <summary> Evaluates the series of Chebyshev polynomials Ti at argument x/2.
8758
/// The series is given by
8859
/// <pre>

src/Numerics/SpecialFunctions/Stability.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static double ExponentialMinusOne(double power)
5656
// Series Expansion to x^k / k!
5757
int k = 0;
5858
double term = 1.0;
59-
return Evaluate.Series(
59+
return Series.Evaluate(
6060
() =>
6161
{
6262
k++;

0 commit comments

Comments
 (0)