20 IEnumerable<double> values,
23 ArgumentNullException.ThrowIfNull(values);
25 double[] series = values.ToArray();
27 if (series.Length == 0)
29 throw new ArgumentException(
30 "Temporal-pattern analysis requires at least one value.",
34 for (
int index = 0; index < series.Length; index++)
36 if (!
double.IsFinite(series[index]))
38 throw new ArgumentOutOfRangeException(
41 $
"Value at zero-based index {index} is not finite.");
48 double maximumAbsoluteValue =
49 series.Max(value => Math.Abs(value));
53 maximumAbsoluteValue);
55 double minimum = series.Min();
56 double maximum = series.Max();
59 maximumAbsoluteValue <= epsilon;
62 maximum - minimum <= epsilon;
64 bool isNonIncreasing =
true;
65 bool isNonDecreasing =
true;
67 for (
int index = 1; index < series.Length; index++)
69 double previous = series[index - 1];
70 double current = series[index];
72 if (current > previous + epsilon)
74 isNonIncreasing =
false;
77 if (current < previous - epsilon)
79 isNonDecreasing =
false;
93 else if (isNonIncreasing && !isNonDecreasing)
97 else if (isNonDecreasing && !isNonIncreasing)