mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[poincare] BinomPDF
This commit is contained in:
@@ -48,6 +48,7 @@ poincare_src += $(addprefix poincare/src/,\
|
||||
binom_cdf.cpp \
|
||||
binomial_coefficient.cpp \
|
||||
binomial_distribution_function.cpp \
|
||||
binom_pdf.cpp \
|
||||
ceiling.cpp \
|
||||
complex.cpp \
|
||||
complex_argument.cpp \
|
||||
|
||||
46
poincare/include/poincare/binom_pdf.h
Normal file
46
poincare/include/poincare/binom_pdf.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef POINCARE_BINOM_PDF_H
|
||||
#define POINCARE_BINOM_PDF_H
|
||||
|
||||
#include <poincare/approximation_helper.h>
|
||||
#include <poincare/binomial_distribution_function.h>
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
class BinomPDFNode final : public BinomialDistributionFunctionNode {
|
||||
public:
|
||||
|
||||
// TreeNode
|
||||
size_t size() const override { return sizeof(BinomPDFNode); }
|
||||
int numberOfChildren() const override;
|
||||
#if POINCARE_TREE_LOG
|
||||
virtual void logNodeName(std::ostream & stream) const override {
|
||||
stream << "BinomPDF";
|
||||
}
|
||||
#endif
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::BinomPDF; }
|
||||
Sign sign(Context * context) const override { return Sign::Positive; }
|
||||
Expression setSign(Sign s, ReductionContext reductionContext) override;
|
||||
|
||||
private:
|
||||
// Layout
|
||||
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
|
||||
int serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
|
||||
|
||||
// Evaluation
|
||||
Evaluation<float> approximate(SinglePrecision p, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const override { return templatedApproximate<float>(context, complexFormat, angleUnit); }
|
||||
Evaluation<double> approximate(DoublePrecision p, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const override { return templatedApproximate<double>(context, complexFormat, angleUnit); }
|
||||
template<typename T> Evaluation<T> templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const;
|
||||
};
|
||||
|
||||
class BinomPDF final : public BinomialDistributionFunction {
|
||||
public:
|
||||
BinomPDF(const BinomPDFNode * n) : BinomialDistributionFunction(n) {}
|
||||
static BinomPDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder<BinomPDF, BinomPDFNode>(ArrayBuilder<TreeHandle>(child0, child1, child2).array(), 3); }
|
||||
static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("binompdf", 3, &UntypedBuilderThreeChildren<BinomPDF>);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -49,6 +49,7 @@ public:
|
||||
ArcTangent,
|
||||
BinomCDF,
|
||||
BinomialCoefficient,
|
||||
BinomPDF,
|
||||
Ceiling,
|
||||
ComplexArgument,
|
||||
Conjugate,
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <poincare/arc_tangent.h>
|
||||
#include <poincare/binom_cdf.h>
|
||||
#include <poincare/binomial_coefficient.h>
|
||||
#include <poincare/binom_pdf.h>
|
||||
#include <poincare/complex_argument.h>
|
||||
#include <poincare/confidence_interval.h>
|
||||
#include <poincare/conjugate.h>
|
||||
|
||||
40
poincare/src/binom_pdf.cpp
Normal file
40
poincare/src/binom_pdf.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#include <poincare/binom_pdf.h>
|
||||
#include <poincare/layout_helper.h>
|
||||
#include <poincare/binomial_distribution.h>
|
||||
#include <poincare/serialization_helper.h>
|
||||
#include <assert.h>
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
constexpr Expression::FunctionHelper BinomPDF::s_functionHelper;
|
||||
|
||||
int BinomPDFNode::numberOfChildren() const { return BinomPDF::s_functionHelper.numberOfChildren(); }
|
||||
|
||||
Expression BinomPDFNode::setSign(Sign s, ReductionContext reductionContext) {
|
||||
assert(s == Sign::Positive);
|
||||
return BinomPDF(this);
|
||||
}
|
||||
|
||||
Layout BinomPDFNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const {
|
||||
return LayoutHelper::Prefix(BinomPDF(this), floatDisplayMode, numberOfSignificantDigits, BinomPDF::s_functionHelper.name());
|
||||
}
|
||||
|
||||
int BinomPDFNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const {
|
||||
return SerializationHelper::Prefix(this, buffer, bufferSize, floatDisplayMode, numberOfSignificantDigits, BinomPDF::s_functionHelper.name());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
Evaluation<T> BinomPDFNode::templatedApproximate(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const {
|
||||
Evaluation<T> xEvaluation = childAtIndex(0)->approximate(T(), context, complexFormat, angleUnit);
|
||||
Evaluation<T> nEvaluation = childAtIndex(1)->approximate(T(), context, complexFormat, angleUnit);
|
||||
Evaluation<T> pEvaluation = childAtIndex(2)->approximate(T(), context, complexFormat, angleUnit);
|
||||
|
||||
T x = xEvaluation.toScalar();
|
||||
T n = nEvaluation.toScalar();
|
||||
T p = pEvaluation.toScalar();
|
||||
|
||||
// EvaluateAtAbscissa handles bad n and p values
|
||||
return Complex<T>::Builder(BinomialDistribution::EvaluateAtAbscissa(x, n, p));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -33,7 +33,7 @@ T BinomialDistribution::EvaluateAtAbscissa(T x, T n, T p) {
|
||||
if (x > n) {
|
||||
return(T)0;
|
||||
}
|
||||
T lResult = std::lgamma(n+(T)1.0) - std::lgamma(std::floor(x)+(T)1.0) - std::lgamma(n - std::floor(x)+(T)1.0)+
|
||||
T lResult = std::lgamma(n+(T)1.0) - std::lgamma(std::floor(x)+(T)1.0) - std::lgamma(n - std::floor(x)+(T)1.0) +
|
||||
std::floor(x)*std::log(p) + (n-std::floor(x))*std::log((T)(1.0)-p);
|
||||
return std::exp(lResult);
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@ private:
|
||||
&HyperbolicArcTangent::s_functionHelper,
|
||||
&BinomCDF::s_functionHelper,
|
||||
&BinomialCoefficient::s_functionHelper,
|
||||
&BinomPDF::s_functionHelper,
|
||||
&Ceiling::s_functionHelper,
|
||||
&ConfidenceInterval::s_functionHelper,
|
||||
&Conjugate::s_functionHelper,
|
||||
|
||||
@@ -269,6 +269,7 @@ template ArcTangent TreeHandle::FixedArityBuilder<ArcTangent, ArcTangentNode>(Tr
|
||||
template BinomCDF TreeHandle::FixedArityBuilder<BinomCDF, BinomCDFNode>(TreeHandle*, size_t);
|
||||
template BinomialCoefficient TreeHandle::FixedArityBuilder<BinomialCoefficient, BinomialCoefficientNode>(TreeHandle*, size_t);
|
||||
template BinomialCoefficientLayout TreeHandle::FixedArityBuilder<BinomialCoefficientLayout, BinomialCoefficientLayoutNode>(TreeHandle*, size_t);
|
||||
template BinomPDF TreeHandle::FixedArityBuilder<BinomPDF, BinomPDFNode>(TreeHandle*, size_t);
|
||||
template Ceiling TreeHandle::FixedArityBuilder<Ceiling, CeilingNode>(TreeHandle*, size_t);
|
||||
template CeilingLayout TreeHandle::FixedArityBuilder<CeilingLayout, CeilingLayoutNode>(TreeHandle*, size_t);
|
||||
template CommonLogarithm TreeHandle::FixedArityBuilder<CommonLogarithm, LogarithmNode<1> >(TreeHandle*, size_t);
|
||||
|
||||
@@ -240,8 +240,8 @@ QUIZ_CASE(poincare_approximation_function) {
|
||||
assert_expression_approximates_to<float>("binomial(10, 4)", "210");
|
||||
assert_expression_approximates_to<double>("binomial(10, 4)", "210");
|
||||
|
||||
assert_expression_approximates_to<float>("binompdf(4, 9, 0.7)", "0.0735138");
|
||||
assert_expression_approximates_to<double>("binompdf(5.3, 9, 0.7)", "0735138");
|
||||
assert_expression_approximates_to<float>("binompdf(4.4, 9, 0.7)", "0.0735138", Degree, Cartesian, 6); // FIXME: precision problem
|
||||
assert_expression_approximates_to<double>("binompdf(4.4, 9, 0.7)", "0.073513818");
|
||||
|
||||
assert_expression_approximates_to<float>("ceil(0.2)", "1");
|
||||
assert_expression_approximates_to<double>("ceil(0.2)", "1");
|
||||
|
||||
Reference in New Issue
Block a user