diff --git a/.Rbuildignore b/.Rbuildignore index 267624e..1e38b20 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -5,5 +5,6 @@ opencl-beignet.df ^docs$ LICENSE ^\.travis\.yml$ +^\.travis$ ^codecov\.yml$ ^inst/libs$ diff --git a/.travis.yml b/.travis.yml index b24bc44..85d5709 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,43 +5,45 @@ sudo: required cache: packages latex: false fortran: false -r: - - oldrel - - release - - devel + +matrix: + include: + - r: oldrel + - r: release + r_packages: + - covr + - devtools + - pkgdown + r_github_packages: + - metrumresearchgroup/covrpage + after_success: + - Rscript -e "covr::codecov()" + deploy: + provider: script + script: Rscript -e 'devtools::install(); covrpage::covrpage_ci(); pkgdown::deploy_site_github()' + skip_cleanup: true + - r: devel + - r: release + os: osx + notifications: email: on_success: change on_failure: change -r_packages: - - devtools - - knitr - - rmarkdown - - pkgKitten - - Matrix - - covr - - pkgdown addons: apt: sources: - sourceline: 'ppa:keithw/glfw3' packages: - libglfw3 +brew_packages: + - fontconfig + - glfw before_install: - - wget --quiet http://arrayfire.s3.amazonaws.com/3.6.2/ArrayFire-v3.6.2_Linux_x86_64.sh - - sudo sh ArrayFire-v3.6.2_Linux_x86_64.sh --skip-license --exclude-subdir --prefix=/usr/local - - rm ArrayFire-v3.6.2_Linux_x86_64.sh - - sudo ldconfig /usr/local/lib64 + - test "$TRAVIS_OS_NAME" == "linux" && sh .travis/before_install_linux.sh || true + - test "$TRAVIS_OS_NAME" == "osx" && sh .travis/before_install_osx.sh || true script: - - export LD_PRELOAD="/usr/local/lib64/libmkl_core.so:/usr/local/lib64/libtbb.so.2:/usr/local/lib64/libmkl_tbb_thread.so" - - export PKG_TARBALL=RcppArrayFire_$(grep '^Version:' DESCRIPTION | grep -o '[0-9\.]*').tar.gz - - R CMD build . + - test "$TRAVIS_OS_NAME" == "linux" && export LD_PRELOAD="/usr/local/lib64/libmkl_core.so:/usr/local/lib64/libtbb.so.2:/usr/local/lib64/libmkl_tbb_thread.so" || true + - export PKG_TARBALL=RcppArrayFire_$(grep '^Version:' DESCRIPTION | grep -oE '[0-9\.]+').tar.gz + - R CMD build --no-manual . - R CMD check --no-manual $PKG_TARBALL -after_success: - - test "$TRAVIS_R_VERSION_STRING" = "release" && Rscript -e 'covr::codecov()' || true -deploy: - skip_cleanup: true - provider: script - script: Rscript -e 'pkgdown::deploy_site_github()' - on: - condition: $TRAVIS_R_VERSION_STRING = release diff --git a/.travis/before_install_linux.sh b/.travis/before_install_linux.sh new file mode 100644 index 0000000..b6aaeb0 --- /dev/null +++ b/.travis/before_install_linux.sh @@ -0,0 +1,4 @@ +wget --quiet http://arrayfire.s3.amazonaws.com/3.6.2/ArrayFire-v3.6.2_Linux_x86_64.sh +sudo sh ArrayFire-v3.6.2_Linux_x86_64.sh --skip-license --exclude-subdir --prefix=/usr/local +rm ArrayFire-v3.6.2_Linux_x86_64.sh +sudo ldconfig /usr/local/lib64 diff --git a/.travis/before_install_osx.sh b/.travis/before_install_osx.sh new file mode 100644 index 0000000..ee32a4f --- /dev/null +++ b/.travis/before_install_osx.sh @@ -0,0 +1,4 @@ +brew install fontconfig glfw +curl -SO https://arrayfire.s3.amazonaws.com/3.6.4/ArrayFire-v3.6.4_OSX_x86_64.pkg +sudo installer -pkg ArrayFire-v3.6.4_OSX_x86_64.pkg -target / +rm ArrayFire-v3.6.4_OSX_x86_64.pkg diff --git a/R/RcppExports.R b/R/RcppExports.R index ac9d1ad..b8b187c 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -1,53 +1,6 @@ # Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 -#' Fast and simple linear model -#' @details Single precision floats are used by default since not all devices support double precision. -#' @param X a model matrix -#' @param y a vector containing the explained variable -#' @param useDouble use float or double internally -#' @return \code{fastLmPure} returns a list with three components: -#' \describe{ -#' \item{\code{coefficients}}{a vector of coefficients} -#' \item{\code{residuals}}{the residuals, that is response minus fitted values} -#' \item{\code{fitted.values}}{the fitted mean values} -#' \item{\code{stderr}}{a vector of the (estimated) standard errors of the coefficient estimates} -#' \item{\code{df.residual}}{a scalar denoting the degrees of freedom in the model} -#' \item{\code{intercept}}{a boolean denoting if a model with intercept was fitted} -#' } -#' @export -fastLmPure <- function(X, y, useDouble = FALSE) { - .Call(`_RcppArrayFire_fastLmPure`, X, y, useDouble) -} - -#' Fast runif alternative -#' @details Fast generation of uniformly distributed random values. The default is to use single precision, -#' since not all devices support calculations using double precision. -#' @param n number of observations -#' @param min lower limit of the distribution -#' @param max upper limit of the distribution -#' @param useDouble use float or double internally -#' @return A numeric vector of random values -#' @seealso \code{\link{runif}} and \url{http://arrayfire.org/docs/group__random__func__randu.htm} -#' @export -fastRunif <- function(n, min = 0, max = 1, useDouble = FALSE) { - .Call(`_RcppArrayFire_fastRunif`, n, min, max, useDouble) -} - -#' Fast rnorm alternative -#' @details Fast generation of normaly distributed random values. The default is to use single precision, -#' since not all devices support calculations using double precision. -#' @param n number of observations -#' @param mean mean value of the distribution -#' @param sd standard deviation of the distribution -#' @param useDouble use float or double internally -#' @return A numeric vector of random values -#' @seealso \code{\link{rnorm}} and \url{http://arrayfire.org/docs/group__random__func__randn.htm} -#' @export -fastRnorm <- function(n, mean = 0, sd = 1, useDouble = FALSE) { - .Call(`_RcppArrayFire_fastRnorm`, n, mean, sd, useDouble) -} - #' Report the information about current device and platform #' @details Return a list containing the information about current device and platform. #' The list object includes device name, palatform information, toolkit information, @@ -142,3 +95,50 @@ arrayfire_set_backend <- function(backend = "DEFAULT") { invisible(.Call(`_RcppArrayFire_arrayfire_set_backend`, backend)) } +#' Fast and simple linear model +#' @details Single precision floats are used by default since not all devices support double precision. +#' @param X a model matrix +#' @param y a vector containing the explained variable +#' @param useDouble use float or double internally +#' @return \code{fastLmPure} returns a list with three components: +#' \describe{ +#' \item{\code{coefficients}}{a vector of coefficients} +#' \item{\code{residuals}}{the residuals, that is response minus fitted values} +#' \item{\code{fitted.values}}{the fitted mean values} +#' \item{\code{stderr}}{a vector of the (estimated) standard errors of the coefficient estimates} +#' \item{\code{df.residual}}{a scalar denoting the degrees of freedom in the model} +#' \item{\code{intercept}}{a boolean denoting if a model with intercept was fitted} +#' } +#' @export +fastLmPure <- function(X, y, useDouble = FALSE) { + .Call(`_RcppArrayFire_fastLmPure`, X, y, useDouble) +} + +#' Fast runif alternative +#' @details Fast generation of uniformly distributed random values. The default is to use single precision, +#' since not all devices support calculations using double precision. +#' @param n number of observations +#' @param min lower limit of the distribution +#' @param max upper limit of the distribution +#' @param useDouble use float or double internally +#' @return A numeric vector of random values +#' @seealso \code{\link{runif}} and \url{http://arrayfire.org/docs/group__random__func__randu.htm} +#' @export +fastRunif <- function(n, min = 0, max = 1, useDouble = FALSE) { + .Call(`_RcppArrayFire_fastRunif`, n, min, max, useDouble) +} + +#' Fast rnorm alternative +#' @details Fast generation of normaly distributed random values. The default is to use single precision, +#' since not all devices support calculations using double precision. +#' @param n number of observations +#' @param mean mean value of the distribution +#' @param sd standard deviation of the distribution +#' @param useDouble use float or double internally +#' @return A numeric vector of random values +#' @seealso \code{\link{rnorm}} and \url{http://arrayfire.org/docs/group__random__func__randn.htm} +#' @export +fastRnorm <- function(n, mean = 0, sd = 1, useDouble = FALSE) { + .Call(`_RcppArrayFire_fastRnorm`, n, mean, sd, useDouble) +} + diff --git a/configure b/configure index 235cc33..b9966e5 100755 --- a/configure +++ b/configure @@ -651,7 +651,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -724,7 +723,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -977,15 +975,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1123,7 +1112,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1276,7 +1265,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -2915,32 +2903,60 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -# set path to root of arrayfire - -# Check whether --with-arrayfire was given. -if test "${with_arrayfire+set}" = set; then : - withval=$with_arrayfire; -fi - - -AF_INCLUDE="" -AF_LIBS="-laf" -if test -e "${AF_PATH}"; then : - - AF_INCLUDE="-I${AF_PATH}/include ${AF_INCLUDE}" - AF_LIBS="-L${AF_PATH}/lib ${AF_LIBS} -Wl,-rpath,${AF_PATH}/lib" +# set path to root of arrayfire +# Check whether --with-arrayfire was given. +if test "${with_arrayfire+set}" = set; then : + withval=$with_arrayfire; AF_PATH = ${with_arrayfire} fi -if test -e "${with_arrayfire}"; then : - - AF_INCLUDE="-I${with_arrayfire}/include ${AF_INCLUDE}" - AF_LIBS="-L${with_arrayfire}/lib ${AF_LIBS} -Wl,-rpath,${with_arrayfire}/lib" - +if test -n "${AF_PATH}" +then + AF_INCLUDE="-I${AF_PATH}/include" + AF_LIBS="-L${AF_PATH}/lib -laf -Wl,-rpath,${AF_PATH}/lib" +else + # let's look around -- code inspiered by RPostgreSQL + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ArrayFire header" >&5 +$as_echo "$as_me: checking for ArrayFire header" >&6;} + for dir in \ + /usr/include \ + /usr/local/include \ + /opt/arrayfire/include + do + { $as_echo "$as_me:${as_lineno-$LINENO}: Checking directory ${dir}." >&5 +$as_echo "$as_me: Checking directory ${dir}." >&6;} + if test -f ${dir}/arrayfire.h + then + AF_INCLUDE="-I${dir}" + break + fi + done + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ArrayFire library" >&5 +$as_echo "$as_me: checking for ArrayFire library" >&6;} + for dir in \ + /usr/lib \ + /usr/lib64 \ + /usr/local/lib \ + /usr/local/lib64 \ + /opt/arrayfire/lib \ + /opt/arrayfire/lib64 + do + { $as_echo "$as_me:${as_lineno-$LINENO}: Checking directory ${dir}." >&5 +$as_echo "$as_me: Checking directory ${dir}." >&6;} + if test -r ${dir}/libaf.so -o -r ${dir}/libaf.dylib + then + AF_LIBS="-L${dir} -laf -Wl,-rpath,${dir}" + break + fi + done +fi + +if test -z "${AF_INCLUDE}" -o -z "${AF_LIBS}"; then : + as_fn_error $? "Cannot find ArrayFire installation." "$LINENO" 5 fi CPPFLAGS="${CPPFLAGS} ${AF_INCLUDE}" diff --git a/configure.ac b/configure.ac index 3dcc109..d129089 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,7 @@ # -*- Autoconf -*- # Copyright (C) 2015 Kazuki Fukui # Copyright (C) 2017 Ralf Stubner (R Institute GmbH) +# Copyright (C) 2019 Ralf Stubner # # This file is part of RcppArrayFire. # @@ -46,28 +47,54 @@ AC_LANG(C++) AC_REQUIRE_CPP AC_PROG_CXX +AC_SUBST([AF_INCLUDE]) +AC_SUBST([AF_LIBS]) + # set path to root of arrayfire AC_ARG_WITH([arrayfire], AC_HELP_STRING([--with-arrayfire=PREFIX], [path to where arrayfire is installed]), - [], + [AF_PATH = ${with_arrayfire}], []) -AC_SUBST([AF_INCLUDE], "") -AC_SUBST([AF_LIBS], "-laf") - -AS_IF([test -e "${AF_PATH}"], - [ - AF_INCLUDE="-I${AF_PATH}/include ${AF_INCLUDE}" - AF_LIBS="-L${AF_PATH}/lib ${AF_LIBS} -Wl,-rpath,${AF_PATH}/lib" - ]) - +if test -n "${AF_PATH}" +then + AF_INCLUDE="-I${AF_PATH}/include" + AF_LIBS="-L${AF_PATH}/lib -laf -Wl,-rpath,${AF_PATH}/lib" +else + # let's look around -- code inspiered by RPostgreSQL + AC_MSG_NOTICE([checking for ArrayFire header]) + for dir in \ + /usr/include \ + /usr/local/include \ + /opt/arrayfire/include + do + AC_MSG_NOTICE([Checking directory ${dir}.]) + if test -f ${dir}/arrayfire.h + then + AF_INCLUDE="-I${dir}" + break + fi + done + AC_MSG_NOTICE([checking for ArrayFire library]) + for dir in \ + /usr/lib \ + /usr/lib64 \ + /usr/local/lib \ + /usr/local/lib64 \ + /opt/arrayfire/lib \ + /opt/arrayfire/lib64 + do + AC_MSG_NOTICE([Checking directory ${dir}.]) + if test -r ${dir}/libaf.so -o -r ${dir}/libaf.dylib + then + AF_LIBS="-L${dir} -laf -Wl,-rpath,${dir}" + break + fi + done +fi -AS_IF([test -e "${with_arrayfire}"], - [ - AF_INCLUDE="-I${with_arrayfire}/include ${AF_INCLUDE}" - AF_LIBS="-L${with_arrayfire}/lib ${AF_LIBS} -Wl,-rpath,${with_arrayfire}/lib" - ]) +AS_IF([test -z "${AF_INCLUDE}" -o -z "${AF_LIBS}"], [AC_MSG_ERROR([Cannot find ArrayFire installation.])]) CPPFLAGS="${CPPFLAGS} ${AF_INCLUDE}" LDFLAGS="${LDFLAGS} ${AF_LIBS}" diff --git a/inst/include/RcppArrayFireForward.h b/inst/include/RcppArrayFireForward.h index 59de307..ffab86e 100644 --- a/inst/include/RcppArrayFireForward.h +++ b/inst/include/RcppArrayFireForward.h @@ -23,11 +23,10 @@ #ifndef RcppArrayFire__RcppArrayFireForward__h #define RcppArrayFire__RcppArrayFireForward__h +#include #include #include -#include - /* forward declarations */ namespace RcppArrayFire{ template< diff --git a/src/Makevars.in b/src/Makevars.in index 1e7c23e..113e098 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -1,5 +1,7 @@ ## enviorment variables for building R package CXX_STD = CXX11 PKG_CPPFLAGS = -I../inst/include @AF_INCLUDE@ -DSTRICT_R_HEADERS -AF_LIBS = @AF_LIBS@ -PKG_LIBS = $(AF_LIBS) +PKG_LIBS = @AF_LIBS@ + +all: $(SHLIB) + @if command -v install_name_tool; then echo "fixing install name"; install_name_tool -id '@rpath/RcppArrayFire.so' RcppArrayFire.so; fi diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index eaf3345..cd50efe 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -6,47 +6,6 @@ using namespace Rcpp; -// fastLmPure -Rcpp::List fastLmPure(const Rcpp::NumericMatrix& X, const Rcpp::NumericVector& y, bool useDouble); -RcppExport SEXP _RcppArrayFire_fastLmPure(SEXP XSEXP, SEXP ySEXP, SEXP useDoubleSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const Rcpp::NumericMatrix& >::type X(XSEXP); - Rcpp::traits::input_parameter< const Rcpp::NumericVector& >::type y(ySEXP); - Rcpp::traits::input_parameter< bool >::type useDouble(useDoubleSEXP); - rcpp_result_gen = Rcpp::wrap(fastLmPure(X, y, useDouble)); - return rcpp_result_gen; -END_RCPP -} -// fastRunif -af::array fastRunif(const int32_t n, const double min, const double max, bool useDouble); -RcppExport SEXP _RcppArrayFire_fastRunif(SEXP nSEXP, SEXP minSEXP, SEXP maxSEXP, SEXP useDoubleSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const int32_t >::type n(nSEXP); - Rcpp::traits::input_parameter< const double >::type min(minSEXP); - Rcpp::traits::input_parameter< const double >::type max(maxSEXP); - Rcpp::traits::input_parameter< bool >::type useDouble(useDoubleSEXP); - rcpp_result_gen = Rcpp::wrap(fastRunif(n, min, max, useDouble)); - return rcpp_result_gen; -END_RCPP -} -// fastRnorm -af::array fastRnorm(const int32_t n, const double mean, const double sd, bool useDouble); -RcppExport SEXP _RcppArrayFire_fastRnorm(SEXP nSEXP, SEXP meanSEXP, SEXP sdSEXP, SEXP useDoubleSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const int32_t >::type n(nSEXP); - Rcpp::traits::input_parameter< const double >::type mean(meanSEXP); - Rcpp::traits::input_parameter< const double >::type sd(sdSEXP); - Rcpp::traits::input_parameter< bool >::type useDouble(useDoubleSEXP); - rcpp_result_gen = Rcpp::wrap(fastRnorm(n, mean, sd, useDouble)); - return rcpp_result_gen; -END_RCPP -} // arrayfire_device_info Rcpp::List arrayfire_device_info(); RcppExport SEXP _RcppArrayFire_arrayfire_device_info() { @@ -147,11 +106,49 @@ BEGIN_RCPP return R_NilValue; END_RCPP } +// fastLmPure +Rcpp::List fastLmPure(const Rcpp::NumericMatrix& X, const Rcpp::NumericVector& y, bool useDouble); +RcppExport SEXP _RcppArrayFire_fastLmPure(SEXP XSEXP, SEXP ySEXP, SEXP useDoubleSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const Rcpp::NumericMatrix& >::type X(XSEXP); + Rcpp::traits::input_parameter< const Rcpp::NumericVector& >::type y(ySEXP); + Rcpp::traits::input_parameter< bool >::type useDouble(useDoubleSEXP); + rcpp_result_gen = Rcpp::wrap(fastLmPure(X, y, useDouble)); + return rcpp_result_gen; +END_RCPP +} +// fastRunif +af::array fastRunif(const int32_t n, const double min, const double max, bool useDouble); +RcppExport SEXP _RcppArrayFire_fastRunif(SEXP nSEXP, SEXP minSEXP, SEXP maxSEXP, SEXP useDoubleSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const int32_t >::type n(nSEXP); + Rcpp::traits::input_parameter< const double >::type min(minSEXP); + Rcpp::traits::input_parameter< const double >::type max(maxSEXP); + Rcpp::traits::input_parameter< bool >::type useDouble(useDoubleSEXP); + rcpp_result_gen = Rcpp::wrap(fastRunif(n, min, max, useDouble)); + return rcpp_result_gen; +END_RCPP +} +// fastRnorm +af::array fastRnorm(const int32_t n, const double mean, const double sd, bool useDouble); +RcppExport SEXP _RcppArrayFire_fastRnorm(SEXP nSEXP, SEXP meanSEXP, SEXP sdSEXP, SEXP useDoubleSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const int32_t >::type n(nSEXP); + Rcpp::traits::input_parameter< const double >::type mean(meanSEXP); + Rcpp::traits::input_parameter< const double >::type sd(sdSEXP); + Rcpp::traits::input_parameter< bool >::type useDouble(useDoubleSEXP); + rcpp_result_gen = Rcpp::wrap(fastRnorm(n, mean, sd, useDouble)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { - {"_RcppArrayFire_fastLmPure", (DL_FUNC) &_RcppArrayFire_fastLmPure, 3}, - {"_RcppArrayFire_fastRunif", (DL_FUNC) &_RcppArrayFire_fastRunif, 4}, - {"_RcppArrayFire_fastRnorm", (DL_FUNC) &_RcppArrayFire_fastRnorm, 4}, {"_RcppArrayFire_arrayfire_device_info", (DL_FUNC) &_RcppArrayFire_arrayfire_device_info, 0}, {"_RcppArrayFire_arrayfire_set_device", (DL_FUNC) &_RcppArrayFire_arrayfire_set_device, 1}, {"_RcppArrayFire_arrayfire_get_device", (DL_FUNC) &_RcppArrayFire_arrayfire_get_device, 0}, @@ -162,6 +159,9 @@ static const R_CallMethodDef CallEntries[] = { {"_RcppArrayFire_arrayfire_get_active_backend", (DL_FUNC) &_RcppArrayFire_arrayfire_get_active_backend, 0}, {"_RcppArrayFire_arrayfire_get_available_backends", (DL_FUNC) &_RcppArrayFire_arrayfire_get_available_backends, 0}, {"_RcppArrayFire_arrayfire_set_backend", (DL_FUNC) &_RcppArrayFire_arrayfire_set_backend, 1}, + {"_RcppArrayFire_fastLmPure", (DL_FUNC) &_RcppArrayFire_fastLmPure, 3}, + {"_RcppArrayFire_fastRunif", (DL_FUNC) &_RcppArrayFire_fastRunif, 4}, + {"_RcppArrayFire_fastRnorm", (DL_FUNC) &_RcppArrayFire_fastRnorm, 4}, {NULL, NULL, 0} };