# Usage with Rcpp

Each procedure’s probability mass function (PMF) and cumulative distribution function (CDF) was implemented in C++ using the `Rcpp` package. By means of `Rcpp::interface`, these functions are exported to both the package’s R namespace and C++ headers. That way, the following functions can then be used by other packages that use `Rcpp`:

    /***   Ordinary Poisson Binomial Distribution   ***/

    /***   Exact Procedures   ***/

    // Direct Convolution (DC)

    // PMF
    NumericVector dpb_conv(const IntegerVector obs,
                           const NumericVector probs);

    // CDF
    NumericVector ppb_conv(const IntegerVector obs,
                           const NumericVector probs,
                           const bool lower_tail);

    // Divide & Conquer FFT Tree Convolution (DC-FFT)

    // PMF
    NumericVector dpb_dc(const IntegerVector obs,
                         const NumericVector probs);

    // CDF
    NumericVector ppb_dc(const IntegerVector obs,
                         const NumericVector probs,
                         const bool lower_tail);

    // Discrete Fourier Transformation of the Characteristic Function (DFT-CF)

    // PMF
    NumericVector dpb_dftcf(const IntegerVector obs,
                            const NumericVector probs);

    // CDF
    NumericVector ppb_dftcf(const IntegerVector obs, const NumericVector probs,
                            const bool lower_tail);

    // Recursive Formula (RF)

    // PMF
    NumericVector dpb_rf(const IntegerVector obs,
                         const NumericVector probs);

    // CDF
    NumericVector ppb_rf(const IntegerVector obs,
                         const NumericVector probs,
                         const bool lower_tail);

    /***   Approximations   ***/

    // Arithmetic Mean Binomial Approximation (AMBA)

    // PMF
    NumericVector dpb_mean(const IntegerVector obs,
                           const NumericVector probs);

    // CDF
    NumericVector ppb_mean(const IntegerVector obs,
                           const NumericVector probs,
                           const bool lower_tail);

    // Geometric Mean Binomial Approximations (GMBA)

    // PMF
    NumericVector dpb_gmba(const IntegerVector obs,
                           const NumericVector const probs,
                           const bool anti);

    // CDF
    NumericVector ppb_gmba(const IntegerVector obs,
                           const NumericVector probs,
                           const bool anti,
                           const bool lower_tail);

    // Poisson Approximation (PA)

    // PMF
    NumericVector dpb_pa(const IntegerVector obs,
                         const NumericVector probs);

    // CDF
    NumericVector ppb_pa(const IntegerVector obs,
                         const NumericVector probs,
                         const bool lower_tail);

    // Normal Approximations (NA, RNA)

    // PMF
    NumericVector dpb_na(const IntegerVector obs,
                         const NumericVector probs,
                         const bool refined);

    // CDF
    NumericVector ppb_na(const IntegerVector obs,
                         const NumericVector probs,
                         const bool refined,
                         const bool lower_tail);

    /***   Generalized Poisson Binomial Distribution   ***/

    /***   Exact Procedures   ***/

    // Generalized Direct Convolution (G-DC)

    // PMF
    NumericVector dgpb_conv(const IntegerVector obs,
                            const NumericVector probs,
                            const NumericVector val_p,
                            const NumericVector val_q);

    // CDF
    NumericVector pgpb_conv(const IntegerVector obs,
                            const NumericVector probs,
                            const NumericVector val_p,
                            const NumericVector val_q,
                            const bool lower_tail);

    // Generalized Discrete Fourier Transformation of the Characteristic Function (G-DFT-CF)

    // PMF
    NumericVector dgpb_dftcf(const IntegerVector obs,
                             const NumericVector probs,
                             const NumericVector val_p,
                             const NumericVector val_q);

    // CDF
    NumericVector pgpb_dftcf(const IntegerVector obs,
                             const NumericVector probs,
                             const NumericVector val_p,
                             const NumericVector val_q,
                             const bool lower_tail);

    /***   Approximations   ***/

    // Generalized Normal Approximations (G-NA, G-RNA)

    // PMF
    NumericVector dgpb_na(const IntegerVector obs,
                          const NumericVector probs,
                          const NumericVector val_p,
                          const NumericVector val_q,
                          const bool refined,
                          const bool lower_tail);

    // CDF
    NumericVector pgpb_na(const IntegerVector obs,
                          const NumericVector probs,
                          const NumericVector val_p,
                          const NumericVector val_q,
                          const bool refined,
                          const bool lower_tail);

## Making the functions usable

There are only a few simple steps to follow:

1. Add the `Rcpp` and `PoissonBinomial` packages to the `Imports` and `LinkingTo` fields of the `DESCRIPTION` file.
2. Add `#include <PoissonBinomial.h>` to source (`.cpp`) and/or header (`.h`, `.hpp`) files in which these functions are to be used.
3. Optional: Add `using namespace PoissonBinomial;`. Without it, the use of functions of this package must be fully qualified with `PoissonBinomial::`, e.g. `PoissonBinomial::dpb_dc` instead of `dpb_dc`

## Important Remarks

For better performance, the PMFs and CDFs do not check any of their parameters for plausibility! This must be done by the user by means of R or C/C++ functions. It must be made sure that

- the observations in the `obs` vectors are valid,
- the probabilities in the `probs` vector are in \((0, 1)\) and
- for `dpb_gmba`, `ppb_gmba`, `dpb_na`, `ppb_na`, `dgpb_na` and `pgpb_na`: the probabilities in the `probs` vector must not contain zeros or ones.

Furthermore, the CDFs only compute non-logarithmic probabilities. If logarithms are needed, they must be computed “manually”.