From a9c47a946837bf8d76fa0e625480cee13ca0c76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Mon, 11 May 2020 16:27:37 +0200 Subject: [PATCH] [apps/probability] Change geometric distribution definition THe distribution now represents the number of trials neded before a success, so is defined for k in {1, 2, 3, ...} --- .../distribution/geometric_distribution.cpp | 17 +++++++++-------- .../distribution/geometric_distribution.h | 4 +--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/probability/distribution/geometric_distribution.cpp b/apps/probability/distribution/geometric_distribution.cpp index 6c76fd365..ed64b23ab 100644 --- a/apps/probability/distribution/geometric_distribution.cpp +++ b/apps/probability/distribution/geometric_distribution.cpp @@ -15,8 +15,7 @@ float GeometricDistribution::xMax() const { } float GeometricDistribution::yMax() const { - int maxAbscissa = 0; - float result = evaluateAtAbscissa(maxAbscissa); + float result = evaluateAtAbscissa(1.0); // Tha probability is max for x == 1 return result * (1.0f + k_displayTopMarginRatio); } @@ -29,16 +28,18 @@ bool GeometricDistribution::authorizedValueAtIndex(float x, int index) const { } template -T GeometricDistribution::templatedApproximateAtAbscissa(T x) const { - if (x < 0) { +T GeometricDistribution::templatedApproximateAtAbscissa(T k) const { + constexpr T castedOne = static_cast(1.0); + if (k < castedOne) { return static_cast(0.0); } T p = static_cast(m_parameter1); - if (p == static_cast(1.0)) { - return static_cast(x == 0 ? 1.0 : 0.0); + if (p == castedOne) { + return k == castedOne ? castedOne : static_cast(0.0); } - T lResult = x * std::log(static_cast(1.0) - p); - return p*std::exp(lResult); + // The result is p * (1-p)^{k-1} + T lResult = (k - castedOne) * std::log(castedOne - p); + return p * std::exp(lResult); } } diff --git a/apps/probability/distribution/geometric_distribution.h b/apps/probability/distribution/geometric_distribution.h index 035d2945e..e6903555a 100644 --- a/apps/probability/distribution/geometric_distribution.h +++ b/apps/probability/distribution/geometric_distribution.h @@ -7,9 +7,7 @@ namespace Probability { /* We chose the definition: * 0 < p <= 1 for success probability - * k failures where k ∈ {0, 1, 2, ... } - * The distribution follows the probability distribution of the number of failures before - * the first success. */ + * k number of trials needed to get one success, where k ∈ {1, 2, 3, ...}. */ class GeometricDistribution final : public OneParameterDistribution { public: