expint/0000755000176200001440000000000014326736253011574 5ustar liggesusersexpint/NAMESPACE0000644000176200001440000000023314220225222012767 0ustar liggesusers### C code useDynLib(expint, .registration = TRUE, .fixes = "C_") ### Exports export(expint, expint_E1, expint_E2, expint_En, expint_Ei) export(gammainc) expint/man/0000755000176200001440000000000014220225222012325 5ustar liggesusersexpint/man/gammainc.Rd0000644000176200001440000000352114220225222014371 0ustar liggesusers\name{gammainc} \alias{gammainc} \alias{gamma_inc} \alias{IncompleteGammaFunction} \title{Incomplete Gamma Function} \description{ The incomplete gamma function \eqn{\Gamma(a, x)}{G(a, x)}. } \usage{ gammainc(a, x) } \arguments{ \item{a}{vector of real numbers.} \item{x}{vector of non-negative real numbers.} } \details{ As defined in 6.5.3 of Abramowitz and Stegun (1972), the incomplete gamma function is \deqn{ \Gamma(a, x) = \int_x^\infty t^{a-1} e^{-t}\, dt}{% G(a, x) = int_x^Inf t^(a - 1) exp(-t) dt} for \eqn{a} real and \eqn{x \ge 0}. For non-negative values of \eqn{a}, we have \deqn{ \Gamma(a, x) = \Gamma(a) (1 - P(a, x)),}{% G(a, x) = Gamma(a) (1 - P(a, x)),} where \eqn{\Gamma(a)}{Gamma(a)} is the function implemented by \R's \code{\link{gamma}()} and \eqn{P(a, x)}{P(a, x)} is the cumulative distribution function of the gamma distribution (with scale equal to one) implemented by \R's \code{\link{pgamma}()}. Also, \eqn{\Gamma(0, x) = E_1(x)}{G(0, x) = E_1(x)}, \eqn{x > 0}, where \eqn{E_1(x)} is the exponential integral implemented in \code{\link{expint}}. } \value{ The value of the incomplete gamma function. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ The C implementation is based on code from the GNU Software Library \url{https://www.gnu.org/software/gsl/}. } \references{ Abramowitz, M. and Stegun, I. A. (1972), \emph{Handbook of Mathematical Functions}, Dover. } \seealso{ \code{\link{expint}} } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## a > 0 x <- c(0.2, 2.5, 5, 8, 10) a <- 1.2 gammainc(a, x) gamma(a) * pgamma(x, a, 1, lower = FALSE) # same ## a = 0 a <- 0 gammainc(a, x) expint(x) # same ## a < 0 a <- c(-0.25, -1.2, -2) sapply(a, gammainc, x = x) } \keyword{math} expint/man/expint-package.Rd0000644000176200001440000000300614220225222015513 0ustar liggesusers\name{expint-package} \alias{expint-package} \docType{package} \title{ \packageTitle{expint} } \description{ The exponential integrals \eqn{E_1(x)}, \eqn{E_2(x)}, \eqn{E_n(x)} and \eqn{Ei(x)}, and the incomplete gamma function \eqn{\Gamma(a, x)}{G(a, x)} that is defined for negative values of its first argument. } \details{ The exponential integral \deqn{ E_1(x) = \int_x^\infty \frac{e^{-t}}{t}\, dt}{% E_1(x) = int_x^Inf exp(-t)/t dt} and the incomplete gamma function \deqn{ \Gamma(a, x) = \int_x^\infty t^{a-1} e^{-t}\, dt}{% G(a, x) = int_x^Inf t^(a-1) exp(-t) dt} are closely related functions that arise in various fields of mathematics. \pkg{expint} is a small package that provides \R functions to compute the exponential integral and the incomplete gamma function. Most conveniently for \R package developers, the package also gives access to the underlying C workhorses through an API; see the package vignette for instructions. The C routines are adapted versions of those of the GNU Scientific Library \url{https://www.gnu.org/software/gsl/}. } \seealso{ \code{\link{expint}} for the exponential integral family of functions. \code{\link{gammainc}} for the incomplete gamma function. \code{vignette("expint")} for a detailed presentation of the package. } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \references{ Abramowitz, M. and Stegun, I. A. (1972), \emph{Handbook of Mathematical Functions}, Dover. } \keyword{package} \keyword{math} expint/man/expint.Rd0000644000176200001440000000647514220225222014137 0ustar liggesusers\name{expint} \alias{expint} \alias{expint_E1} \alias{expint_E2} \alias{expint_En} \alias{expint_Ei} \alias{ExponentialIntegral} \title{Exponential Integral} \description{ The exponential integrals \eqn{E_1(x)}, \eqn{E_2(x)}, \eqn{E_n(x)} and \eqn{Ei}. } \usage{ expint(x, order = 1L, scale = FALSE) expint_E1(x, scale = FALSE) expint_E2(x, scale = FALSE) expint_En(x, order, scale = FALSE) expint_Ei(x, scale = FALSE) } \arguments{ \item{x}{vector of real numbers.} \item{order}{vector of non-negative integers; see Details.} \item{scale}{logical; when \code{TRUE} the result will be scaled by \eqn{e^x}{exp(x)}.} } \details{ Abramowitz and Stegun (1972) first define the exponential integral as \deqn{ E_1(x) = \int_x^\infty \frac{e^{-t}}{t}\, dt, \quad x \ne 0.}{% E_1(x) = int_x^Inf exp(-t)/t dt, x != 0.} An alternative definition (to be understood in terms of the Cauchy principal value due to the singularity of the integrand at zero) is \deqn{ \mathrm{Ei}(x) = - \int_{-x}^\infty \frac{e^{-t}}{t}\, dt = - E_1(-x).}{% Ei(x) = - int_{-x}^Inf exp(-t)/t dt = - E_1(-x).} The exponential integral can also generalized to \code{order} \eqn{n} as \deqn{ E_n(x) = \int_1^\infty \frac{e^{-xt}}{t^n}\, dt,}{% E_n(x) = int_1^Inf exp(-xt)/t^n dt,} for \eqn{n = 0, 1, 2, \dots}; \eqn{x} a real number (non-negative when \eqn{n > 2}). The following relation holds: \deqn{ E_n(x) = x^{n - 1} \Gamma(1 - n, x),}{% E_n(x) = x^(n-1) G(1-n, x),} where \eqn{\Gamma(a, x)}{G(a, x)} is the incomplete gamma function implemented in \code{\link{gammainc}}. By definition, \eqn{E_0(x) = x^{-1} e^{-x}}{E_0(x) = exp(-x)/x}, \eqn{x \ne 0}{x != 0}. Function \code{expint} is vectorized in both \code{x} and \code{order}, whereas function \code{expint_En} expects a single value for \code{order} and will only use the first value if \code{order} is a vector. Non-integer values of \code{order} will be silently coerced to integers using truncation towards zero. } \value{ The value of the exponential integral. Invalid arguments will result in return value \code{NaN}, with a warning. } \note{ The C implementation is based on code from the GNU Software Library \url{https://www.gnu.org/software/gsl/}. } \references{ Abramowitz, M. and Stegun, I. A. (1972), \emph{Handbook of Mathematical Functions}, Dover. } \seealso{ \code{\link{gammainc}} } \author{ Vincent Goulet \email{vincent.goulet@act.ulaval.ca} } \examples{ ## See section 5.3 of Abramowitz and Stegun expint(1.275, order = 1:10) expint(10, order = 1:10) * 1e5 expint(c(1.275, 10), order = c(1, 2)) expint_E1(1.275) # same as above expint_E2(10) # same as above ## Figure 5.1 of Abramowitz and Stegun curve(expint_Ei, xlim = c(0, 1.6), ylim = c(-3.9, 3.9), ylab = "y") abline(h = 0) curve(expint_E1, add = TRUE) x <- 1.5 text(x, c(expint_Ei(x), expint_E1(x)), expression(Ei(x), E[1](x)), adj = c(0.5, -0.5)) ## Figure 5.2 of Abramowitz and Stegun plot(NA, xlim = c(-1.6, 1.6), ylim = c(0, 1), xlab = "x", ylab = expression(E[n](x))) n <- c(10, 5, 3, 2, 1, 0) for (order in n) curve(expint_En(x, order), add = TRUE) x <- c(0.1, 0.15, 0.25, 0.35, 0.5, 0.7) text(x, expint(x, n), paste("n =", n), adj = c(-0.2, -0.5)) } \keyword{math} expint/DESCRIPTION0000644000176200001440000000424714326736252013310 0ustar liggesusersPackage: expint Type: Package Title: Exponential Integral and Incomplete Gamma Function Version: 0.1-8 Date: 2022-10-28 Authors@R: c(person("Vincent", "Goulet", role = c("cre", "aut"), email = "vincent.goulet@act.ulaval.ca"), person("Gerard", "Jungman", role = "aut", email = "jungman@lanl.gov", comment = "Original GSL code"), person("Brian", "Gough", role = "aut", email = "jungman@lanl.gov", comment = "Original GSL code"), person("Jeffrey A.", "Ryan", role = "aut", email = "jeff.a.ryan@gmail.com", comment = "Package API"), person("Robert", "Gentleman", role = "aut", comment = "Parts of the R to C interface"), person("Ross", "Ihaka", role = "aut", comment = "Parts of the R to C interface"), person(family = "R Core Team", role = "aut", comment = "Parts of the R to C interface"), person(family = "R Foundation", role = "aut", comment = "Parts of the R to C interface")) Description: The exponential integrals E_1(x), E_2(x), E_n(x) and Ei(x), and the incomplete gamma function G(a, x) defined for negative values of its first argument. The package also gives easy access to the underlying C routines through an API; see the package vignette for details. A test package included in sub-directory example_API provides an implementation. C routines derived from the GNU Scientific Library . Depends: R (>= 3.3.0) License: GPL (>= 2) URL: https://gitlab.com/vigou3/expint BugReports: https://gitlab.com/vigou3/expint/-/issues Encoding: UTF-8 NeedsCompilation: yes Packaged: 2022-10-28 05:58:03 UTC; vincent Author: Vincent Goulet [cre, aut], Gerard Jungman [aut] (Original GSL code), Brian Gough [aut] (Original GSL code), Jeffrey A. Ryan [aut] (Package API), Robert Gentleman [aut] (Parts of the R to C interface), Ross Ihaka [aut] (Parts of the R to C interface), R Core Team [aut] (Parts of the R to C interface), R Foundation [aut] (Parts of the R to C interface) Maintainer: Vincent Goulet Repository: CRAN Date/Publication: 2022-10-28 11:27:38 UTC expint/build/0000755000176200001440000000000014326667553012701 5ustar liggesusersexpint/build/vignette.rds0000644000176200001440000000031214326667553015234 0ustar liggesusersb```b`abd`b2 1# 'J(+ +G()&&[&3a8DXԱ%ifwI-HK î?}ީE0=(jؠjX2sRad9.nP&c0Gq?gQ~nݣ9JI,IK+#4Texpint/build/partial.rdb0000644000176200001440000000753614326667546015043 0ustar liggesuserskWFV 6τd;0&4IM %NBNItd42*Jrm~ݯ[iÞfg+{2ɽk;5Far@S)=wΆ\q|P4k!{B şU%~gJk?i 1Éxo oɊE9WIE}n?[x+`M%E&Jׄ:6}-TW~}h) Pok?,^9N뭍 aSʠD3K Ci .$몄 t_,$:XTy@V sD~jFiTꍗ?>+Uw*e"|qO(9/Ū-/ hP99Q$md/釹>uǥtnizܱo8B1.3F1NA:G%( /`Fצ0FF:&B? 2Itq0` ~V'#Uip!Z!S6yJc;pdj>z-RtyjݪT7֫# cл}ceǰr2,{b~,C~ h,:=4etroAW}ݜ$_QHC(GM%c6̭yسzt ]P%182ĦEnYa%_u 9TωPqE n:u`O|>Z_,H²a ɺ4\,QKPDDbZN ŸJ^ε6K i2HB@̺0] q38`H-D\_?wxsY,nhE"w!q!Yyic۽?xGl"^6;Zc~IQ{'7I)20B㍭Izw$,FPm[9}]MrЦnZľZ k &YZL6}$qv90fۙA- lkTSG5͸ΌgRElKmj6CEu{abZRzKb21f'w6r;2 -!ʹbMu X08[XR4b`ZQ Рdu*A0z[%ҐWdE;OA| +WROeoC0QLy@!s#]jJŚ\ԍZekT3R: _ʰjjec?G=mar-F5(gF`D@#g ƅZ0۳5>5@T yU"^<y^ԥÎ]?ˀ_N{ة |pfLfGb)9Mt~yY8(r 2Nj# >qSٵTka]xVAtx,XI͙r(Ϫ~Zu681Oavh9E`6R!'ؠyqRT_p5ʓt[ Ƣ33ǎYa<Ҋ3B)rH6$NMQL[)$ -GŚ-ܪ ZMUh ($\ :c$Ot=P#BՍǥ^q;ps כVpn!^VjM3dJoS 4mB@ӭnW(S);,-r_Aaa*mI~掉M&%Y arv :Z75a*w^^J!TY6Ygpo }-:&} Kr!DA~hƚ tHԵTtSQ6 0q؜2Py / $m۝p< +2/,*x2tIDcA>1'G)?ȫn$ =j":BTQT]ʩh^ob ZʁDb++?hM+&a6KGsd4zNtBJ5vXy[/ dw={F [ݟ"rom`I78]x禷&=$Rm(] tuY۹oXB)xKi,+ N1PmW Oj=rGinwܤX5Y\Liڍ7['=!L8}:2tš7)[A\V"8o ;E5ɂ]ܧ6;]eѿiHr /9U~%8WzfՎC5KETBi]z*d$_: @Cz7D'p>޿NC]2_O9#lD& #G2GwG?lEҜ5U=CIj˔tߐi>QI[֫k\ ۵{^{@#i)%5žwȔ'L7dʤ28$̦#Da3p 4y_*UӾ3>NU(N$.ҳj| )h7(|r[lW7lo~.L pOPR2^=zX],TU|8RѳSgH_d3S,Y,Ɠ7R3z|;"Dk=+.e}-VJPwf[˹?0!·\! Jcexpint/tests/0000755000176200001440000000000014326667553012744 5ustar liggesusersexpint/tests/expint-tests.R0000644000176200001440000002021314326667517015534 0ustar liggesusers### == expint: Exponential Integral and Incomplete Gamma Function == ### ### Tests for the exponential integral Ei and the exponential integral ### of order 'n = 1, 2, ...' ### ### E_n = int_x^infty exp(-t)/t^n dt. ### ### AUTHOR: Vincent Goulet ## Load the package library(expint) ### ### Basic functionality ### ## Some values of x x <- runif(10, 0, 10) ## Equivalence between interfaces stopifnot(exprs = { identical(expint(x, order = 1), expint_E1(x), expint_En(x, order = 1)) identical(expint(x, order = 2), expint_E2(x), expint_En(x, order = 2)) identical(expint(x, order = 3), expint_En(x, order = 3)) identical(expint(x, order = 10), expint_En(x, order = 10)) identical(expint(x, order = 1, scale = TRUE), expint_E1(x, scale = TRUE)) identical(expint(x, order = 2, scale = TRUE), expint_E2(x, scale = TRUE)) identical(expint(x, order = 3, scale = TRUE), expint_En(x, order = 3, scale = TRUE)) identical(expint(x, order = 10, scale = TRUE), expint_En(x, order = 10, scale = TRUE)) }) ## Identity between Ei and E1 stopifnot(exprs = { identical(expint_Ei(x), -expint_E1(-x)) identical(expint_Ei(x, scale = TRUE), -expint_E1(-x, scale = TRUE)) }) ## Vectorization of arguments stopifnot(exprs = { identical(expint(head(x), order = 1:3), c(expint(x[1], 1), expint(x[2], 2), expint(x[3], 3), expint(x[4], 1), expint(x[5], 2), expint(x[6], 3))) }) ### ### Values from Table 5.1 of Abramovitz and Stegun ### ## Target values xsmall <- c(1:4/100, seq(0.05, 0.5, by = 0.05)) TARGET_EI_SMALL <- c(1.002505566, 1.005022306, 1.007550283, 1.010089560, 1.012640202, 1.025566141, 1.038786018, 1.052308298, 1.066141726, 1.080295334, 1.094778451, 1.109600714, 1.124772082, 1.140302841) TARGET_E1_SMALL <- c(0.9975055452, 0.9950221392, 0.9925497201, 0.9900882265, 0.9876375971, 0.9755453033, 0.9637156702, 0.9521414833, 0.9408157528, 0.9297317075, 0.9188827858, 0.9082626297, 0.8978650778, 0.8876841584) xmed <- c(0.50, 0.60, 0.75, 1.00, 1.25, 1.55, 1.80, 2.00) TARGET_EI_MED <- c(0.454219905, 0.769881290, 1.207332816, 1.895117816, 2.581047974, 3.451954503, 4.249867557, 4.954234356) TARGET_E1_MED <- c(0.559773595, 0.454379503, 0.340340813, 0.219383934, 0.146413373, 0.092882108, 0.064713129, 0.048900511) xlarge <- c(2.0, 3.5, 5.0, 7.5, 10.0) TARGET_EI_LARGE <- c(1.340965420, 1.471782389, 1.353831278, 1.200421500, 1.131470205) TARGET_E1_LARGE <- c(0.722657234, 0.807867661, 0.852110880, 0.892687854, 0.915633339) EULER <- 0.57721566490153286060651209008 ## Tests stopifnot(exprs = { all.equal((expint_Ei(xsmall) - log(xsmall) - EULER)/xsmall, TARGET_EI_SMALL) all.equal((expint_E1(xsmall) + log(xsmall) + EULER)/xsmall, TARGET_E1_SMALL) all.equal(expint_Ei(xmed), TARGET_EI_MED) all.equal(expint_E1(xmed), TARGET_E1_MED) all.equal(xlarge * exp(-xlarge) * expint_Ei(xlarge), TARGET_EI_LARGE) all.equal(xlarge * expint_Ei(xlarge, scale = TRUE), TARGET_EI_LARGE) all.equal(xlarge * exp(xlarge) * expint_E1(xlarge), TARGET_E1_LARGE) all.equal(xlarge * expint_E1(xlarge, scale = TRUE), TARGET_E1_LARGE) }) ### ### Values from Table 5.2 of Abramovitz and Stegun ### ## Target values xinv <- seq(0.100, 0.005, by = -0.005) TARGET_EI <- c(1.13147021, 1.12249671, 1.11389377, 1.10564739, 1.09773775, 1.09014087, 1.08283054, 1.07578038, 1.06896548, 1.06236365, 1.05595591, 1.04972640, 1.04366194, 1.03775135, 1.03198503, 1.02635451, 1.02085228, 1.01547157, 1.01020625, 1.00505077) TARGET_E1 <- c(0.9156333394, 0.9192568286, 0.9229315844, 0.9266590998, 0.9304409399, 0.9342787466, 0.9381742450, 0.9421292486, 0.9461456670, 0.9502255126, 0.9543709099, 0.9585841038, 0.9628674711, 0.9672235311, 0.9716549596, 0.9761646031, 0.9807554965, 0.9854308813, 0.9901942287, 0.9950492646) ## Tests stopifnot(exprs = { all.equal(expint_Ei(1/xinv) * exp(-1/xinv)/xinv, TARGET_EI) all.equal(expint_Ei(1/xinv, scale = TRUE)/xinv, TARGET_EI) all.equal(expint_E1(1/xinv) * exp(1/xinv)/xinv, TARGET_E1) all.equal(expint_E1(1/xinv, scale = TRUE)/xinv, TARGET_E1) }) ### ### Values from Table 5.4 of Abramovitz and Stegun ### ## Target values xsmall <- c(0.01, 0.10, 0.25, 0.30, 0.50) osmall <- c(3, 4, 10, 20) TARGET_E2_SMALL <- c(0.9957222, 0.9528035, 0.8643037, 0.8303071, 0.6732175) TARGET_EN_SMALL <- c(0.4902766, 0.3283824, 0.1098682, 0.0520790, 0.4162915, 0.2877361, 0.0992984, 0.0473600, 0.3246841, 0.2325432, 0.0839220, 0.0404285, 0.3000418, 0.2169352, 0.0793524, 0.0383518, 0.2216044, 0.1652428, 0.0634583, 0.0310612) TARGET_EN_SMALL <- matrix(TARGET_EN_SMALL, nrow = length(xsmall), ncol = length(osmall), byrow = TRUE) xlarge <- c(0.55, 1.00, 1.25, 1.50, 2.00) olarge <- c(2, 3, 4, 10, 20) TARGET_EN_LARGE <- c(0.3000996, 0.2059475, 0.1545596, 0.0600159, 0.0294670, 0.1484955, 0.1096920, 0.0860625, 0.0363940, 0.0183460, 0.1034881, 0.0785723, 0.0627631, 0.0275988, 0.0141035, 0.0731008, 0.0567395, 0.0460070, 0.0209461, 0.0108440, 0.0375343, 0.0301334, 0.0250228, 0.0120921, 0.0064143) TARGET_EN_LARGE <- matrix(TARGET_EN_LARGE, nrow = length(xlarge), ncol = length(olarge), byrow = TRUE) ## Tests stopifnot(exprs = { all.equal(expint_E2(xsmall) - xsmall * log(xsmall), TARGET_E2_SMALL, tol = 5e-8) all.equal(outer(xsmall, osmall, expint), TARGET_EN_SMALL, tol = 5e-7) all.equal(outer(xlarge, olarge, expint), TARGET_EN_LARGE, tol = 5e-7) }) ### ### Values from Table 5.5 of Abramovitz and Stegun ### ## Target values xinv <- c(seq(0.50, 0.10, by = -0.05), seq(0.09, 0.01, by = -0.01)) order <- c(2, 3, 4, 10, 20) TARGET_EN <- c(1.10937, 1.11329, 1.10937, 1.07219, 1.04270, 1.09750, 1.10285, 1.10071, 1.06926, 1.04179, 1.08533, 1.09185, 1.09136, 1.06586, 1.04067, 1.07292, 1.08026, 1.08125, 1.06187, 1.03932, 1.06034, 1.06808, 1.07031, 1.05712, 1.03762, 1.04770, 1.05536, 1.05850, 1.05138, 1.03543, 1.03522, 1.04222, 1.04584, 1.04432, 1.03249, 1.02325, 1.02895, 1.03247, 1.03550, 1.02837, 1.01240, 1.01617, 1.01889, 1.02436, 1.02222, 1.01045, 1.01377, 1.01624, 1.02182, 1.02060, 1.00861, 1.01147, 1.01366, 1.01917, 1.01883, 1.00688, 1.00927, 1.01116, 1.01642, 1.01688, 1.00528, 1.00721, 1.00878, 1.01360, 1.01472, 1.00384, 1.00531, 1.00654, 1.01074, 1.01234, 1.00258, 1.00361, 1.00451, 1.00790, 1.00973, 1.00152, 1.00217, 1.00275, 1.00516, 1.00692, 1.00071, 1.00103, 1.00133, 1.00271, 1.00401, 1.00019, 1.00027, 1.00036, 1.00081, 1.00137) TARGET_EN <- matrix(TARGET_EN, nrow = length(xinv), ncol = length(order), byrow = TRUE) ## Tests stopifnot(exprs = { all.equal(outer(1/xinv, order, "+") * exp(1/xinv) * outer(1/xinv, order, expint), TARGET_EN, tolerance = 5e-6) all.equal(outer(1/xinv, order, "+") * outer(1/xinv, order, expint, scale = TRUE), TARGET_EN, tolerance = 5e-6) }) ### ### Examples from section 5.3 of Abramowitz and Stegun ### ## Target values order <- 1:10 xsmall <- 1.275 TARGET_SMALL <- c(0.1408099, 0.0998984, 0.0760303, 0.0608307, 0.0504679, 0.0430168, 0.0374307, 0.0331009, 0.0296534, 0.0268469) xlarge <- 10 TARGET_LARGE <- c(0.41570, 0.38302, 0.35488, 0.33041, 0.30898, 0.29005, 0.27325, 0.25822, 0.24472, 0.23253) ## Tests stopifnot(exprs = { all.equal(expint(xsmall, order), TARGET_SMALL, tolerance = 1e-6) all.equal(expint(xlarge, order) * 1e5, TARGET_LARGE, tolerance = 1e-5) }) expint/tests/gammainc-tests.R0000644000176200001440000000250114326667517016001 0ustar liggesusers### == expint: Exponential Integral and Incomplete Gamma Function == ### ### Tests for the incomplete gamma function ### ### G(a,x) = int_x^infty t^{a-1} exp(-t) dt ### ### for a *real* and x >= 0. ### ### AUTHOR: Vincent Goulet ## Load the package library(expint) ## a > 0; direct link to the standard incomplete gamma function x <- c(0.2, 2.5, 5, 8, 10) a <- 1.2 stopifnot(exprs = { identical(gammainc(a, x), gamma(a) * pgamma(x, a, 1, lower = FALSE)) }) ## a = 0; direct link to the exponential integral x <- c(0.2, 2.5, 5, 8, 10) a <- 0 stopifnot(exprs = { identical(gammainc(a, x), expint(x)) identical(gammainc(a, x), expint_E1(x)) }) ## a < 0; compare to the recursive formula x <- c(0.2, 2.5, 5, 8, 10) a <- c(-0.25, -1.2, -2) stopifnot(exprs = { all.equal(gammainc(a[1], x), -(x^a[1] * exp(-x))/a[1] + gamma(a[1] + 1) * pgamma(x, a[1] + 1, 1, lower = FALSE)/a[1]) all.equal(gammainc(a[2], x), -(x^a[2] * exp(-x))/a[2] + (-(x^(a[2] + 1) * exp(-x))/(a[2] + 1) + gamma(a[2] + 2) * pgamma(x, a[2] + 2, 1, lower = FALSE)/(a[2] + 1))/a[2]) all.equal( gammainc(a[3], x), -(x^a[3] * exp(-x))/a[3] + (-(x^(a[3] + 1) * exp(-x))/(a[3] + 1) + expint_E1(x)/(a[3] + 1))/a[3]) }) expint/src/0000755000176200001440000000000014326667553012371 5ustar liggesusersexpint/src/gamma_inc.c0000644000176200001440000002231014326537164014440 0ustar liggesusers/* == expint: Exponential Integral and Incomplete Gamma Function == * * Functions to compute the incomplete gamma function * * G(a,x) = int_x^infty t^{a-1} exp(-t) dt * * for 'a' real and 'x' >= 0. [This differs from 'pgamma' of base R * in that negative values of 'a' are admitted.] * * Copyright (C) 2016 Vincent Goulet * * The code in part IMPLEMENTATION is derived from the GNU Scientific * Library (GSL) v2.2.1 * * Copyright (C) 2007 Brian Gough * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman * * The code in part R TO C INTERFACE is derived from R source code. * * Copyright (C) 1995--1997 Robert Gentleman and Ross Ihaka * Copyright (C) 1998--2016 The R Core Team. * Copyright (C) 2003--2016 The R Foundation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * AUTHOR for the GSL: G. Jungman * AUTHOR for expint: Vincent Goulet * with much indirect help from the R Core Team */ #include #include #include #include "locale.h" #include "expint.h" /* * IMPLEMENTATION OF THE WORKHORSE * * Adapted from "special functions" material in the GSL. * */ /* Continued fraction which occurs in evaluation * of Q(a,x) or Gamma(a,x). * * 1 (1-a)/x 1/x (2-a)/x 2/x (3-a)/x * F(a,x) = ---- ------- ----- -------- ----- -------- ... * 1 + 1 + 1 + 1 + 1 + 1 + * * Hans E. Plesser, 2002-01-22 (hans dot plesser at itf dot nlh dot no). * * Split out from gamma_inc_Q_CF() by GJ [Tue Apr 1 13:16:41 MST 2003]. * See gamma_inc_Q_CF() below. * */ double gamma_inc_F_CF(double a, double x) { const int nmax = 5000; const double small = R_pow_di(DBL_EPSILON, 3); double hn = 1.0; /* convergent */ double Cn = 1.0 / small; double Dn = 1.0; int n; /* n == 1 has a_1, b_1, b_0 independent of a,x, so that has been done by hand */ for (n = 2 ; n < nmax ; n++) { double an; double delta; if (E1_IS_ODD(n)) an = 0.5 * (n - 1)/x; else an = (0.5 * n - a)/x; Dn = 1.0 + an * Dn; if (fabs(Dn) < small) Dn = small; Cn = 1.0 + an/Cn; if (fabs(Cn) < small) Cn = small; Dn = 1.0/Dn; delta = Cn * Dn; hn *= delta; if (fabs(delta-1.0) < DBL_EPSILON) break; } if (n == nmax) warning(_("maximum number of iterations reached in gamma_inc_F_CF")); return hn; } /* Useful for small a and x. Handles the subtraction analytically. */ double gamma_inc_Q_series(double a, double x) { const int nmax = 5000; double term1; /* 1 - x^a/Gamma(a+1) */ double sum; /* 1 + (a+1)/(a+2)(-x)/2! + (a+1)/(a+3)(-x)^2/3! + ... */ int n; double term2; /* a temporary variable used at the end */ { /* Evaluate series for 1 - x^a/Gamma(a+1), small a */ const double pg21 = -2.404113806319188570799476; /* PolyGamma[2,1] */ const double lnx = log(x); const double el = EULER_CNST + lnx; const double c1 = -el; const double c2 = M_PI*M_PI/12.0 - 0.5*el*el; const double c3 = el*(M_PI*M_PI/12.0 - el*el/6.0) + pg21/6.0; const double c4 = -0.04166666666666666667 * (-1.758243446661483480 + lnx) * (-0.764428657272716373 + lnx) * ( 0.723980571623507657 + lnx) * ( 4.107554191916823640 + lnx); const double c5 = -0.0083333333333333333 * (-2.06563396085715900 + lnx) * (-1.28459889470864700 + lnx) * (-0.27583535756454143 + lnx) * ( 1.33677371336239618 + lnx) * ( 5.17537282427561550 + lnx); const double c6 = -0.0013888888888888889 * (-2.30814336454783200 + lnx) * (-1.65846557706987300 + lnx) * (-0.88768082560020400 + lnx) * ( 0.17043847751371778 + lnx) * ( 1.92135970115863890 + lnx) * ( 6.22578557795474900 + lnx); const double c7 = -0.00019841269841269841 * (-2.5078657901291800 + lnx) * (-1.9478900888958200 + lnx) * (-1.3194837322612730 + lnx) * (-0.5281322700249279 + lnx) * ( 0.5913834939078759 + lnx) * ( 2.4876819633378140 + lnx) * ( 7.2648160783762400 + lnx); const double c8 = -0.00002480158730158730 * (-2.677341544966400 + lnx) * (-2.182810448271700 + lnx) * (-1.649350342277400 + lnx) * (-1.014099048290790 + lnx) * (-0.191366955370652 + lnx) * ( 0.995403817918724 + lnx) * ( 3.041323283529310 + lnx) * ( 8.295966556941250 + lnx); const double c9 = -2.75573192239859e-6 * (-2.8243487670469080 + lnx) * (-2.3798494322701120 + lnx) * (-1.9143674728689960 + lnx) * (-1.3814529102920370 + lnx) * (-0.7294312810261694 + lnx) * ( 0.1299079285269565 + lnx) * ( 1.3873333251885240 + lnx) * ( 3.5857258865210760 + lnx) * ( 9.3214237073814600 + lnx); const double c10 = -2.75573192239859e-7 * (-2.9540329644556910 + lnx) * (-2.5491366926991850 + lnx) * (-2.1348279229279880 + lnx) * (-1.6741881076349450 + lnx) * (-1.1325949616098420 + lnx) * (-0.4590034650618494 + lnx) * ( 0.4399352987435699 + lnx) * ( 1.7702236517651670 + lnx) * ( 4.1231539047474080 + lnx) * ( 10.342627908148680 + lnx); term1 = a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*(c9+a*c10))))))))); } { /* Evaluate the sum */ double t = 1.0; sum = 1.0; for (n = 1; n < nmax; n++) { t *= -x/(n+1.0); sum += (a+1.0)/(a+n+1.0)*t; if (fabs(t/sum) < DBL_EPSILON) break; } } term2 = (1.0 - term1) * a/(a + 1.0) * x * sum; if (n == nmax) warning(_("maximum number of iterations reached in gamma_inc_F_CF")); return term1 + term2; } /* Adapted from specfun/gamma_inc.c in GSL sources. Note that base R * function 'gammafn' and 'pgamma' are used for postive values of * 'a'. */ double gamma_inc(double a, double x) { #ifdef IEEE_754 if (ISNAN(x) || ISNAN(a)) return a + x; #endif if (x < 0.0) return(R_NaN); else if (x == 0.0) return gammafn(a); else if (a == 0.0) return expint_E1(x, 0); else if (a > 0.0) return gammafn(a) * pgamma(x, a, 1, 0, 0); else if (x > 0.25) { /* continued fraction seems to fail for x too small; otherwise it is ok, independent of the value of |x/a|, because of the non-oscillation in the expansion, i.e. the CF is un-conditionally convergent for a < 0 and x > 0 */ return exp((a - 1) * log(x) - x) * gamma_inc_F_CF(a, x); } else if (fabs(a) < 0.5) { return gammafn(a) * gamma_inc_Q_series(a, x); } else { /* a = fa + da; da >= 0 */ const double fa = floor(a); const double da = a - fa; double gax = (da > 0.0 ? gammafn(da) * pgamma(x, da, 1, 0, 0) : expint_E1(x, 0)); double alpha = da; /* Gamma(alpha-1,x) = 1/(alpha-1) (Gamma(a,x) - x^(alpha-1) e^-x) */ do { const double shift = exp(-x + (alpha - 1.0) * log(x)); gax = (gax - shift)/(alpha - 1.0); alpha -= 1.0; } while (alpha > a); return gax; } } /* * R TO C INTERFACE * * Adapted from src/main/arithmetic.c in R sources and from a similar * scheme in package actuar. Main difference: everything is in this * one file. * */ #define mod_iterate1(n1, n2, i1, i2) \ for (i = i1 = i2 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ ++i) /* Function called by .External() */ SEXP expint_do_gammainc(SEXP args) { SEXP sx, sa, sy; int i, ix, ia, n, nx, na; double ai, *a, xi, *x, *y; Rboolean naflag = FALSE; args = CDR(args); /* drop function name from arguments */ if (!isNumeric(CAR(args)) || !isNumeric(CADR(args))) error(_("invalid arguments")); na = LENGTH(CAR(args)); nx = LENGTH(CADR(args)); if ((na == 0) || (nx == 0)) return(allocVector(REALSXP, 0)); n = (nx < na) ? na : nx; PROTECT(sa = coerceVector(CAR(args), REALSXP)); PROTECT(sx = coerceVector(CADR(args), REALSXP)); PROTECT(sy = allocVector(REALSXP, n)); a = REAL(sa); x = REAL(sx); y = REAL(sy); mod_iterate1(na, nx, ia, ix) { ai = a[ia]; xi = x[ix]; if (ISNA(ai) || ISNA(xi)) y[i] = NA_REAL; else if (ISNAN(ai) || ISNAN(xi)) y[i] = R_NaN; else { y[i] = gamma_inc(ai, xi); if (ISNAN(y[i])) naflag = TRUE; } } if (naflag) warning(R_MSG_NA); if (n == na) { SET_ATTRIB(sy, duplicate(ATTRIB(sa))); SET_OBJECT(sy, OBJECT(sa)); } else if (n == nx) { SET_ATTRIB(sy, duplicate(ATTRIB(sx))); SET_OBJECT(sy, OBJECT(sx)); } UNPROTECT(3); return sy; } expint/src/locale.h0000644000176200001440000000023714220225222013753 0ustar liggesusers/* Localization */ #include #ifdef ENABLE_NLS #include #define _(String) dgettext ("expint", String) #else #define _(String) (String) #endif expint/src/init.c0000644000176200001440000000171314326537046013473 0ustar liggesusers/* == expint: Exponential Integral and Incomplete Gamma Function == * * Native routines registration, as per "Writing R extensions". * * AUTHOR: Vincent Goulet */ #include #include #include #include "expint.h" static const R_ExternalMethodDef ExternalEntries[] = { {"expint_do_expint", (DL_FUNC) &expint_do_expint, -1}, {"expint_do_gammainc", (DL_FUNC) &expint_do_gammainc, -1}, {NULL, NULL, 0} }; void attribute_visible R_init_expint(DllInfo *dll) { R_registerRoutines(dll, NULL, NULL, NULL, ExternalEntries); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); R_RegisterCCallable("expint", "expint_E1", (DL_FUNC) expint_E1); R_RegisterCCallable("expint", "expint_E2", (DL_FUNC) expint_E2); R_RegisterCCallable("expint", "expint_En", (DL_FUNC) expint_En); R_RegisterCCallable("expint", "gamma_inc", (DL_FUNC) gamma_inc); } expint/src/Makevars0000644000176200001440000000012514324537534014054 0ustar liggesusers## Hide entry points (but for R_init_expint in init.c) PKG_CFLAGS = $(C_VISIBILITY) expint/src/expint.c0000644000176200001440000004322314326540001014022 0ustar liggesusers/* == expint: Exponential Integral and Incomplete Gamma Function == * * Functions to compute the exponential integral functions * * E_1(x) = int_x^infty exp(-t)/t dt, * E_2(x) = int_x^infty exp(-t)/t^2 dt * * and * * E_n(x) = int_x^infty exp(-t)/t^n dt. * * Copyright (C) 2016 Vincent Goulet * * The code in part IMPLEMENTATION is derived from the GNU Scientific * Library (GSL) v2.2.1 * * Copyright (C) 2007 Brian Gough * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman * * The code in part R TO C INTERFACE is derived from R source code. * * Copyright (C) 1995--1997 Robert Gentleman and Ross Ihaka * Copyright (C) 1998--2016 The R Core Team. * Copyright (C) 2003--2016 The R Foundation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * AUTHOR for the GSL: G. Jungman * AUTHOR for expint: Vincent Goulet * with much indirect help from the R Core Team */ #include #include #include #include "locale.h" #include "expint.h" /* Prototypes of auxiliary functions */ static SEXP expint1_1(SEXP, SEXP, double (*f)(double, int)); static SEXP expint2_1(SEXP, SEXP, SEXP, double (*f)(double, int, int)); /* * IMPLEMENTATION OF THE WORKHORSES * * Adapted from "special functions" material in the GSL. * */ /* Data structure for a Chebyshev series over a given interval */ struct cheb_series_struct { double * c; /* coefficients */ int order; /* order of expansion */ double a; /* lower interval point */ double b; /* upper interval point */ int order_sp; /* effective single precision order */ }; typedef struct cheb_series_struct cheb_series; /* Chebyshev expansions: based on SLATEC e1.f, W. Fullerton Series for AE11 on the interval -1.00000D-01 to 0. with weighted error 1.76E-17 log weighted error 16.75 significant figures required 15.70 decimal places required 17.55 Series for AE12 on the interval -2.50000D-01 to -1.00000D-01 with weighted error 5.83E-17 log weighted error 16.23 significant figures required 15.76 decimal places required 16.93 Series for E11 on the interval -4.00000D+00 to -1.00000D+00 with weighted error 1.08E-18 log weighted error 17.97 significant figures required 19.02 decimal places required 18.61 Series for E12 on the interval -1.00000D+00 to 1.00000D+00 with weighted error 3.15E-18 log weighted error 17.50 approx significant figures required 15.8 decimal places required 18.10 Series for AE13 on the interval 2.50000D-01 to 1.00000D+00 with weighted error 2.34E-17 log weighted error 16.63 significant figures required 16.14 decimal places required 17.33 Series for AE14 on the interval 0. to 2.50000D-01 with weighted error 5.41E-17 log weighted error 16.27 significant figures required 15.38 decimal places required 16.97 */ static double AE11_data[39] = { 0.121503239716065790, -0.065088778513550150, 0.004897651357459670, -0.000649237843027216, 0.000093840434587471, 0.000000420236380882, -0.000008113374735904, 0.000002804247688663, 0.000000056487164441, -0.000000344809174450, 0.000000058209273578, 0.000000038711426349, -0.000000012453235014, -0.000000005118504888, 0.000000002148771527, 0.000000000868459898, -0.000000000343650105, -0.000000000179796603, 0.000000000047442060, 0.000000000040423282, -0.000000000003543928, -0.000000000008853444, -0.000000000000960151, 0.000000000001692921, 0.000000000000607990, -0.000000000000224338, -0.000000000000200327, -0.000000000000006246, 0.000000000000045571, 0.000000000000016383, -0.000000000000005561, -0.000000000000006074, -0.000000000000000862, 0.000000000000001223, 0.000000000000000716, -0.000000000000000024, -0.000000000000000201, -0.000000000000000082, 0.000000000000000017 }; static cheb_series AE11_cs = { AE11_data, 38, -1, 1, 20 }; static double AE12_data[25] = { 0.582417495134726740, -0.158348850905782750, -0.006764275590323141, 0.005125843950185725, 0.000435232492169391, -0.000143613366305483, -0.000041801320556301, -0.000002713395758640, 0.000001151381913647, 0.000000420650022012, 0.000000066581901391, 0.000000000662143777, -0.000000002844104870, -0.000000000940724197, -0.000000000177476602, -0.000000000015830222, 0.000000000002905732, 0.000000000001769356, 0.000000000000492735, 0.000000000000093709, 0.000000000000010707, -0.000000000000000537, -0.000000000000000716, -0.000000000000000244, -0.000000000000000058 }; static cheb_series AE12_cs = { AE12_data, 24, -1, 1, 15 }; static double E11_data[19] = { -16.11346165557149402600, 7.79407277874268027690, -1.95540581886314195070, 0.37337293866277945612, -0.05692503191092901938, 0.00721107776966009185, -0.00078104901449841593, 0.00007388093356262168, -0.00000620286187580820, 0.00000046816002303176, -0.00000003209288853329, 0.00000000201519974874, -0.00000000011673686816, 0.00000000000627627066, -0.00000000000031481541, 0.00000000000001479904, -0.00000000000000065457, 0.00000000000000002733, -0.00000000000000000108 }; static cheb_series E11_cs = { E11_data, 18, -1, 1, 13 }; static double E12_data[16] = { -0.03739021479220279500, 0.04272398606220957700, -0.13031820798497005440, 0.01441912402469889073, -0.00134617078051068022, 0.00010731029253063780, -0.00000742999951611943, 0.00000045377325690753, -0.00000002476417211390, 0.00000000122076581374, -0.00000000005485141480, 0.00000000000226362142, -0.00000000000008635897, 0.00000000000000306291, -0.00000000000000010148, 0.00000000000000000315 }; static cheb_series E12_cs = { E12_data, 15, -1, 1, 10 }; static double AE13_data[25] = { -0.605773246640603460, -0.112535243483660900, 0.013432266247902779, -0.001926845187381145, 0.000309118337720603, -0.000053564132129618, 0.000009827812880247, -0.000001885368984916, 0.000000374943193568, -0.000000076823455870, 0.000000016143270567, -0.000000003466802211, 0.000000000758754209, -0.000000000168864333, 0.000000000038145706, -0.000000000008733026, 0.000000000002023672, -0.000000000000474132, 0.000000000000112211, -0.000000000000026804, 0.000000000000006457, -0.000000000000001568, 0.000000000000000383, -0.000000000000000094, 0.000000000000000023 }; static cheb_series AE13_cs = { AE13_data, 24, -1, 1, 15 }; static double AE14_data[26] = { -0.18929180007530170, -0.08648117855259871, 0.00722410154374659, -0.00080975594575573, 0.00010999134432661, -0.00001717332998937, 0.00000298562751447, -0.00000056596491457, 0.00000011526808397, -0.00000002495030440, 0.00000000569232420, -0.00000000135995766, 0.00000000033846628, -0.00000000008737853, 0.00000000002331588, -0.00000000000641148, 0.00000000000181224, -0.00000000000052538, 0.00000000000015592, -0.00000000000004729, 0.00000000000001463, -0.00000000000000461, 0.00000000000000148, -0.00000000000000048, 0.00000000000000016, -0.00000000000000005 }; static cheb_series AE14_cs = { AE14_data, 25, -1, 1, 13 }; /* Adapted from specfun/cheb_eval.c in GSL sources */ static inline double cheb_eval(const cheb_series * cs, const double x) { int j; double d = 0.0; double dd = 0.0; double y = (2.0*x - cs->a - cs->b) / (cs->b - cs->a); double y2 = 2.0 * y; for(j = cs->order; j >= 1; j--) { double temp = d; d = y2*d - dd + cs->c[j]; dd = temp; } return y*d - dd + 0.5 * cs->c[0]; } /* Adapted from specfun/expint.c::expint_E1_impl in GSL sources */ double expint_E1(double x, int scale) { #ifdef IEEE_754 if (ISNAN(x)) return x; #endif const double xmaxt = -LOG_DBL_MIN; /* XMAXT = -LOG(DBL_MIN) */ const double xmax = xmaxt - log(xmaxt); /* XMAX = XMAXT - LOG(XMAXT) */ if (x < -xmax && !scale) { warning(_("overflow in expint_E1")); return R_PosInf; } else if (x <= -10.0) { const double s = 1.0/x * (scale ? 1.0 : exp(-x)); const double cheb = cheb_eval(&AE11_cs, 20.0/x+1.0); return s * (1.0 + cheb); } else if (x <= -4.0) { const double s = 1.0/x * (scale ? 1.0 : exp(-x)); const double cheb = cheb_eval(&AE12_cs, (40.0/x+7.0)/3.0); return s * (1.0 + cheb); } else if (x <= -1.0) { const double s = (scale ? exp(x) : 1.0); const double ln_term = -log(fabs(x)); const double cheb = cheb_eval(&E11_cs, (2.0*x+5.0)/3.0); return s * (ln_term + cheb); } else if (x == 0.0) { return R_NaN; } else if (x <= 1.0) { const double s = (scale ? exp(x) : 1.0); const double ln_term = -log(fabs(x)); const double cheb = cheb_eval(&E12_cs, x); return s * (ln_term - 0.6875 + x + cheb); } else if (x <= 4.0) { const double s = 1.0/x * (scale ? 1.0 : exp(-x)); const double cheb = cheb_eval(&AE13_cs, (8.0/x-5.0)/3.0); return s * (1.0 + cheb); } else if (x <= xmax || scale) { const double s = 1.0/x * (scale ? 1.0 : exp(-x)); const double cheb = cheb_eval(&AE14_cs, 8.0/x-1.0); double res = s * (1.0 + cheb); if (res == 0.0) { warning(_("underflow in expint_E1")); return 0.0; } else return res; } else { warning(_("underflow in expint_E1")); return 0.0; } } /* Adapted from specfun/expint.c::expint_E2_impl in GSL sources */ double expint_E2(double x, int scale) { #ifdef IEEE_754 if (ISNAN(x)) return x; #endif const double xmaxt = -LOG_DBL_MIN; const double xmax = xmaxt - log(xmaxt); if (x < -xmax && !scale) { warning(_("overflow in expint_E2")); return R_PosInf; } else if (x == 0.0) { return 1.0; } else if (x < 100.0) { const double ex = (scale ? 1.0 : exp(-x)); return ex - x * expint_E1(x, scale); } else if (x < xmax || scale) { const double s = (scale ? 1.0 : exp(-x)); const double c1 = -2.0; const double c2 = 6.0; const double c3 = -24.0; const double c4 = 120.0; const double c5 = -720.0; const double c6 = 5040.0; const double c7 = -40320.0; const double c8 = 362880.0; const double c9 = -3628800.0; const double c10 = 39916800.0; const double c11 = -479001600.0; const double c12 = 6227020800.0; const double c13 = -87178291200.0; const double y = 1.0/x; const double sum6 = c6+y*(c7+y*(c8+y*(c9+y*(c10+y*(c11+y*(c12+y*c13)))))); const double sum = y*(c1+y*(c2+y*(c3+y*(c4+y*(c5+y*sum6))))); double res = s * (1.0 + sum)/x; if (res == 0.0) { warning(_("underflow in expint_E2")); return 0.0; } else return res; } else { warning(_("underflow in expint_E2")); return 0.0; } } /* Macro used in expint_En (only) */ #define CHECK_UNDERFLOW(x) \ if (fabs(x) < DBL_MIN) { \ warning(_("underflow in expint_En")); \ return 0.0; \ } \ /* Adapted from specfun/expint.c::expint_En_impl in GSL sources */ double expint_En(double x, int n, int scale) { #ifdef IEEE_754 if (ISNAN(x)) return x; #endif if (n < 0) return R_NaN; else if (n == 0) { if (x == 0) return R_NaN; else { double res = (scale ? 1.0 : exp(-x)) / x; CHECK_UNDERFLOW(res); return res; } } else if (n == 1) return expint_E1(x, scale); else if (n == 2) return expint_E2(x, scale); else { if (x < 0) return R_NaN; if (x == 0) { double res = (scale ? exp(x) : 1 ) * (1/(n-1.0)); CHECK_UNDERFLOW(res); return res; } else { double s = (scale ? exp(x) : 1.0); double res = gamma_inc((double) 1 - n, x); res *= s * R_pow_di(x, n - 1); CHECK_UNDERFLOW(res); return res; } } } /* * R TO C INTERFACE * * Adapted from src/main/arithmetic.c in R sources and from a similar * scheme in package actuar. Main difference: everything is in this * one file. * */ /* Functions to handle cases with one argument (REAL) and an integer * flag */ static SEXP expint1_1(SEXP sx, SEXP sI, double (*f)(double, int)) { SEXP sy; int i, nx, sxo = OBJECT(sx); double xi, *x, *y; int i_1; Rboolean naflag = FALSE; if (!isNumeric(sx)) error(_("invalid arguments")); nx = LENGTH(sx); if (nx == 0) return(allocVector(REALSXP, 0)); PROTECT(sx = coerceVector(sx, REALSXP)); PROTECT(sy = allocVector(REALSXP, nx)); x = REAL(sx); y = REAL(sy); i_1 = asInteger(sI); for (i = 0; i < nx; i++) { xi = x[i]; if (ISNA(xi)) y[i] = NA_REAL; else if (ISNAN(xi)) y[i] = R_NaN; else { y[i] = f(xi, i_1); if (ISNAN(y[i])) naflag = TRUE; } } if (naflag) warning(R_MSG_NA); SET_ATTRIB(sy, duplicate(ATTRIB(sx))); SET_OBJECT(sy, sxo); UNPROTECT(2); return sy; } #define EXPINT1_1(A, FUN) expint1_1(CAR(A), CADR(A), FUN); SEXP expint_do_expint1(int code, SEXP args) { switch (code) { case 1: return EXPINT1_1(args, expint_E1); case 2: return EXPINT1_1(args, expint_E2); default: error(_("internal error in expint_do_expint1")); } return args; /* never used; to keep -Wall happy */ } /* Functions to handle cases with two arguments (REAL and INTEGER) and * an integer flag */ #define mod_iterate2(n1, n2, i1, i2) \ for (i = i1 = i2 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ ++i) static SEXP expint2_1(SEXP sx, SEXP sa, SEXP sI, double (*f)(double, int, int)) { SEXP sy; int i, ix, ia, n, nx, na, sxo = OBJECT(sx), sao = OBJECT(sa); double xi, *x, *y; int ai, *a, i_1; Rboolean naflag = FALSE; if (!isNumeric(sx) || !isNumeric(sa)) error(_("invalid arguments")); nx = LENGTH(sx); na = LENGTH(sa); if ((nx == 0) || (na == 0)) return(allocVector(REALSXP, 0)); n = (nx < na) ? na : nx; PROTECT(sx = coerceVector(sx, REALSXP)); PROTECT(sa = coerceVector(sa, INTSXP)); PROTECT(sy = allocVector(REALSXP, n)); x = REAL(sx); a = INTEGER(sa); y = REAL(sy); i_1 = asInteger(sI); mod_iterate2(nx, na, ix, ia) { xi = x[ix]; ai = a[ia]; if (ISNA(xi) || ai == NA_INTEGER) y[i] = NA_REAL; else if (ISNAN(xi)) y[i] = R_NaN; else { if (ai == 1) y[i] = expint_E1(xi, i_1); else if (ai == 2) y[i] = expint_E2(xi, i_1); else y[i] = f(xi, ai, i_1); if (ISNAN(y[i])) naflag = TRUE; } } if (naflag) warning(R_MSG_NA); if (n == nx) { SET_ATTRIB(sy, duplicate(ATTRIB(sx))); SET_OBJECT(sy, sxo); } else if (n == na) { SET_ATTRIB(sy, duplicate(ATTRIB(sa))); SET_OBJECT(sy, sao); } UNPROTECT(3); return sy; } #define EXPINT2_1(A, FUN) expint2_1(CAR(A), CADR(A), CADDR(A), FUN); SEXP expint_do_expint2(int code, SEXP args) { switch (code) { case 1: return EXPINT2_1(args, expint_En); default: error(_("internal error in expint_do_expint2")); } return args; /* never used; to keep -Wall happy */ } /* Data structure for internal functions */ typedef struct { char *name; SEXP (*cfun)(int, SEXP); int code; } expint_tab_struct; static expint_tab_struct expint_tab[] = { /* One argument functions */ {"E1", expint_do_expint1, 1}, {"E2", expint_do_expint1, 2}, /* Two argument functions */ {"En", expint_do_expint2, 1}, {0, 0, 0} }; /* Function called by .External() */ SEXP expint_do_expint(SEXP args) { int i; const char *name; /* Extract type of exponential integral */ args = CDR(args); name = CHAR(STRING_ELT(CAR(args), 0)); /* Dispatch to expint_do_expint[1,2] */ for (i = 0; expint_tab[i].name; i++) { if (!strcmp(expint_tab[i].name, name)) { return expint_tab[i].cfun(expint_tab[i].code, CDR(args)); } } /* No dispatch is an error */ error("internal error in expint_do_expint"); return args; /* never used; to keep -Wall happy */ } expint/src/expint.h0000644000176200001440000000166414326540001014032 0ustar liggesusers/* == expint: Exponential Integral and Incomplete Gamma Function == * * Declarations for the package and various constant and macro * definitions. * * AUTHOR: Vincent Goulet */ #include /* Error messages */ #define R_MSG_NA _("NaNs produced") /* Functions accessed from .External() */ SEXP expint_do_expint(SEXP); SEXP expint_do_expint1(int, SEXP); SEXP expint_do_expint2(int, SEXP); SEXP expint_do_gammainc(SEXP); /* Exported functions */ double expint_E1(double x, int scale); double expint_E2(double x, int scale); double expint_En(double x, int order, int scale); double gamma_inc(double a, double x); /* Constants (taken from gsl_machine.h in GSL sources) */ #define LOG_DBL_MIN (-7.0839641853226408e+02) #define LOG_DBL_MAX 7.0978271289338397e+02 #define EULER_CNST 0.57721566490153286060651209008 /* Macros */ #define E1_IS_ODD(n) ((n) & 1) /* taken from GSL */ expint/vignettes/0000755000176200001440000000000014326667553013612 5ustar liggesusersexpint/vignettes/auto/0000755000176200001440000000000014326662202014544 5ustar liggesusersexpint/vignettes/auto/expint.el0000644000176200001440000000355714326662202016407 0ustar liggesusers(TeX-add-style-hook "expint" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("article" "x11names" "english"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("inputenc" "utf8") ("natbib" "round") ("helvet" "scaled=0.92") ("mathpazo" "sc") ("Sweave" "noae" "inconsolata"))) (add-to-list 'LaTeX-verbatim-environments-local "Verbatim") (add-to-list 'LaTeX-verbatim-environments-local "lstlisting") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "href") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "article" "art10" "fontenc" "inputenc" "amsmath" "natbib" "babel" "microtype" "helvet" "mathpazo" "Sweave" "framed" "xcolor" "hyperref") (TeX-add-symbols '("file" 1) '("samp" 1) '("code" 1) '("pkg" 1) "Ei" "FrameCommand") (LaTeX-add-labels "sec:introduction" "sec:expint" "eq:E1" "eq:Ei_vs_E1" "eq:En_vs_gammainc" "eq:En:recurrence" "eq:En:asymptotic" "sec:gammainc" "eq:gammainc" "eq:gammainc_vs_pgamma" "sec:interfaces" "sec:api" "sec:implementation" "sec:alternatives" "sec:examples") (LaTeX-add-environments '("exercice" LaTeX-env-args ["argument"] 0)) (LaTeX-add-bibliographies) (LaTeX-add-xcolor-definecolors "link" "url" "citation" "codebg")) :latex) expint/vignettes/framed.sty0000644000176200001440000005366114220225222015574 0ustar liggesusers% framed.sty v 0.96 2011/10/22 % Copyright (C) 1992-2011 by Donald Arseneau (asnd@triumf.ca) % These macros may be freely transmitted, reproduced, or modified % for any purpose provided that this notice is left intact. % %====================== Begin Instructions ======================= % % framed.sty % ~~~~~~~~~~ % Create framed, shaded, or differently highlighted regions that can % break across pages. The environments defined are % framed - ordinary frame box (\fbox) with edge at margin % oframed - framed with open top/bottom at page breaks % shaded - shaded background (\colorbox) bleeding into margin % shaded* - shaded background (\colorbox) with edge at margin % snugshade - shaded with tight fit around text (esp. in lists) % snugshade* - like snugshade with shading edge at margin % leftbar - thick vertical line in left margin % % to be used like % \begin{framed} % copious text % \end{framed} % % But the more general purpose of this package is to facilitate the % definition of new environments that take multi-line material, % wrap it with some non-breakable formatting (some kind of box or % decoration) and allow page breaks in the material. Such environments % are defined to declare (or use) \FrameCommand for applying the boxy % decoration, and \MakeFramed{settings} ... \endMakeFramed wrapped % around the main text argument (environment body). % % The "framed" environment uses "\fbox", by default, as its "\FrameCommand" % with the additional settings "\fboxrule=\FrameRule" and "\fboxsep=\FrameSep". % You can change these lengths (using "\setlength") and you can change % the definition of "\FrameCommand" to use much fancier boxes. % % In fact, the "shaded" environment just redefines \FrameCommand to be % "\colorbox{shadecolor}" (and you have to define the color `"shadecolor"': % "\definecolor{shadecolor}..."). % % Although the intention is for other packages to define the varieties % of decoration, a command "\OpenFbox" is defined for frames with open % tops or bottoms, and used for the "oframed" environment. This facility % is based on a more complex and capable command "\CustomFBox" which can % be used for a wider range of frame styles. One such style of a title-bar % frame with continuation marks is provided as an example. It is used by % the "titled-frame" environment. To make use of "titled-frame" in your % document, or the "\TitleBarFrame" command in your own environment % definitions, you must define the colors TFFrameColor (for the frame) % and a contrasting TFTitleColor (for the title text). % % A page break is allowed, and even encouraged, before the framed % environment. If you want to attach some text (a box title) to the % frame, then the text should be inserted by \FrameCommand so it cannot % be separated from the body. % % The contents of the framed regions are restricted: % Floats, footnotes, marginpars and head-line entries will be lost. % (Some of these may be handled in a later version.) % This package will not work with the page breaking of multicol.sty, % or other systems that perform column-balancing. % % The MakeFramed environment does the work. Its `settings' argument % should contain any adjustments to the text width (via a setting of % "\hsize"). Here, the parameter "\width" gives the measured extra width % added by the frame, so a common setting is "\advance\hsize-\width" % which reduces the width of the text just enough that the outer edge % of the frame aligns with the margins. The `settings' should also % include a `restore' command -- "\@parboxrestore" or "\FrameRestore" % or something similar; for instance, the snugshade environment uses % settings to eliminate list indents and vertical space, but uses % "\hspace" in "\FrameCommand" to reproduce the list margin ouside the % shading. % % There are actually four variants of "\FrameCommand" to allow different % formatting for each part of an environment broken over pages. Unbroken % text is adorned by "\FrameCommand", whereas split text first uses % "\FirstFrameCommand", possibly followed by "\MidFrameCommand", and % finishing with "\LastFrameCommand". The default definitions for % these three just invokes "\FrameCommand", so that all portions are % framed the same way. See the oframe environment for use of distinct % First/Mid/Last frames. % % Expert commands: % \MakeFramed, \endMakeFramed: the "MakeFramed" environment % \FrameCommand: command to draw the frame around its argument % \FirstFrameCommand: the frame for the first part of a split environment % \LastFrameCommand: for the last portion % \MidFrameCommand: for any intermediate segments % \FrameRestore: restore some text settings, but fewer than \@parboxrestore % \FrameRule: length register; \fboxrule for default "framed". % \FrameSep: length register; \fboxsep for default "framed". % \FrameHeightAdjust: macro; height of frame above baseline at top of page % \OuterFrameSep: vertical space before and after the framed env. Defaults to "\topsep" % % This is still a `pre-production' version because I can think of many % features/improvements that should be made. Also, a detailed manual needs % to be written. Nevertheless, starting with version 0.5 it should be bug-free. % % ToDo: % Test more varieties of list % Improve and correct documentation % Propagation of \marks % Handle footnotes (how??) floats (?) and marginpars. % Stretchability modification. % Make inner contents height/depth influence placement. %======================== End Instructions ======================== \ProvidesPackage{framed}[2011/10/22 v 0.96: framed or shaded text with page breaks] \newenvironment{framed}% using default \FrameCommand {\MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} \newenvironment{shaded}{% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\FrameRestore}}% {\endMakeFramed} \newenvironment{shaded*}{% \def\FrameCommand{\fboxsep=\FrameSep \colorbox{shadecolor}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} \newenvironment{leftbar}{% \def\FrameCommand{\vrule width 3pt \hspace{10pt}}% \MakeFramed {\advance\hsize-\width \FrameRestore}}% {\endMakeFramed} % snugshde: Shaded environment that % -- uses the default \fboxsep instead of \FrameSep % -- leaves the text indent unchanged (shading bleeds out) % -- eliminates possible internal \topsep glue (\@setminipage) % -- shrinks inside the margins for lists % An \item label will tend to hang outside the shading, thanks to % the small \fboxsep. \newenvironment{snugshade}{% \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep \colorbox{shadecolor}{##1}\hskip-\fboxsep % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \newenvironment{snugshade*}{% \def\FrameCommand##1{\hskip\@totalleftmargin \colorbox{shadecolor}{##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \newenvironment{oframed}{% open (top or bottom) framed \def\FrameCommand{\OpenFBox\FrameRule\FrameRule}% \def\FirstFrameCommand{\OpenFBox\FrameRule\z@}% \def\MidFrameCommand{\OpenFBox\z@\z@}% \def\LastFrameCommand{\OpenFBox\z@\FrameRule}% \MakeFramed {\advance\hsize-\width \FrameRestore}% }{\endMakeFramed} % A simplified entry to \CustomFBox with two customized parameters: % the thicknesses of the top and bottom rules. Perhaps we want to % use less \fboxsep on the open edges? \def\OpenFBox#1#2{\fboxsep\FrameSep \CustomFBox{}{}{#1}{#2}\FrameRule\FrameRule} % \CustomFBox is like an amalgamation of \fbox and \@frameb@x, % so it can be used by an alternate to \fbox or \fcolorbox, but % it has more parameters for various customizations. % Parameter #1 is inserted (in vmode) right after the top rule % (useful for a title or assignments), and #2 is similar, but % inserted right above the bottom rule. % The thicknesses of the top, bottom, left, and right rules are % given as parameters #3,#4,#5,#6 respectively. They should be % \fboxrule or \z@ (or some other thickness). % The text argument is #7. % An instance of this can be used for the frame of \fcolorbox by % locally defining \fbox before \fcolorbox; e.g., % \def\fbox{\CustomFBox{}{}\z@\z@\fboxrule\fboxrule}\fcolorbox % % Do we need to use different \fboxsep on different sides too? % \long\def\CustomFBox#1#2#3#4#5#6#7{% \leavevmode\begingroup \setbox\@tempboxa\hbox{% \color@begingroup \kern\fboxsep{#7}\kern\fboxsep \color@endgroup}% \hbox{% % Here we calculate and shift for the depth. Done in % a group because one of the arguments might be \@tempdima % (we could use \dimexpr instead without grouping). \begingroup \@tempdima#4\relax \advance\@tempdima\fboxsep \advance\@tempdima\dp\@tempboxa \expandafter\endgroup\expandafter \lower\the\@tempdima\hbox{% \vbox{% \hrule\@height#3\relax #1% \hbox{% \vrule\@width#5\relax \vbox{% \vskip\fboxsep % maybe these should be parameters too \copy\@tempboxa \vskip\fboxsep}% \vrule\@width#6\relax}% #2% \hrule\@height#4\relax}% }% }% \endgroup } % A particular type of titled frame with continuation marks. % Parameter #1 is the title, repeated on each page. \newenvironment{titled-frame}[1]{% \def\FrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame{\textbf{#1}}}% \def\FirstFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame[$\blacktriangleright$]{\textbf{#1}}}% \def\MidFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame[$\blacktriangleright$]{\textbf{#1\ (cont)}}}% \def\LastFrameCommand{\fboxsep8pt\fboxrule2pt \TitleBarFrame{\textbf{#1\ (cont)}}}% \MakeFramed{\advance\hsize-20pt \FrameRestore}}% % note: 8 + 2 + 8 + 2 = 20. Don't use \width because the frame title % could interfere with the width measurement. {\endMakeFramed} % \TitleBarFrame[marker]{title}{contents} % Frame with a label at top, optional continuation marker at bottom right. % Frame color is TFFrameColor and title color is a contrasting TFTitleColor; % both need to be defined before use. The frame itself use \fboxrule and % \fboxsep. If the title is omitted entirely, the title bar is omitted % (use a blank space to force a blank title bar). % \newcommand\TitleBarFrame[3][]{\begingroup \ifx\delimiter#1\delimiter \let\TF@conlab\@empty \else \def\TF@conlab{% continuation label \nointerlineskip \smash{\rlap{\kern\wd\@tempboxa\kern\fboxrule\kern\fboxsep #1}}}% \fi \let\TF@savecolor\current@color \textcolor{TFFrameColor}{% \CustomFBox {\TF@Title{#2}}{\TF@conlab}% \fboxrule\fboxrule\fboxrule\fboxrule {\let\current@color\TF@savecolor\set@color #3}% }\endgroup } % The title bar for \TitleBarFrame \newcommand\TF@Title[1]{% \ifx\delimiter#1\delimiter\else \kern-0.04pt\relax \begingroup \setbox\@tempboxa\vbox{% \kern0.8ex \hbox{\kern\fboxsep\textcolor{TFTitleColor}{#1}\vphantom{Tj)}}% \kern0.8ex}% \hrule\@height\ht\@tempboxa \kern-\ht\@tempboxa \box\@tempboxa \endgroup \nointerlineskip \kern-0.04pt\relax \fi } \chardef\FrameRestore=\catcode`\| % for debug \catcode`\|=\catcode`\% % (debug: insert space after backslash) \newlength\OuterFrameSep \OuterFrameSep=\maxdimen \relax \def\MakeFramed#1{\par % apply default \OuterFrameSep = \topsep \ifdim\OuterFrameSep=\maxdimen \OuterFrameSep\topsep \fi % measure added width and height; call result \width and \height \fb@sizeofframe\FrameCommand \let\width\fb@frw \let\height\fb@frh % insert pre-penalties and skips \begingroup \skip@\lastskip \if@nobreak\else \penalty9999 % updates \page parameters \ifdim\pagefilstretch=\z@ \ifdim\pagefillstretch=\z@ % not infinitely stretchable, so encourage a page break here \edef\@tempa{\the\skip@}% \ifx\@tempa\zero@glue \penalty-30 \else \vskip-\skip@ \penalty-30 \vskip\skip@ \fi\fi\fi \penalty\z@ % Give a stretchy breakpoint that will always be taken in preference % to the \penalty 9999 used to update page parameters. The cube root % of 10000/100 indicates a multiplier of 0.21545, but the maximum % calculated badness is really 8192, not 10000, so the multiplier % is 0.2301. \advance\skip@ \z@ plus-.5\baselineskip \advance\skip@ \z@ plus-.231\height \advance\skip@ \z@ plus-.231\skip@ \advance\skip@ \z@ plus-.231\OuterFrameSep \vskip-\skip@ \penalty 1800 \vskip\skip@ \fi \addvspace{\OuterFrameSep}% \endgroup % clear out pending page break \penalty\@M \vskip 2\baselineskip \vskip\height \penalty9999 \vskip -2\baselineskip \vskip-\height \penalty9999 % updates \pagetotal |\message{After clearout, \pagetotal=\the\pagetotal, \pagegoal=\the\pagegoal. }% \fb@adjheight \setbox\@tempboxa\vbox\bgroup #1% Modifications to \hsize (can use \width and \height) \textwidth\hsize \columnwidth\hsize } \def\endMakeFramed{\par \kern\z@ \hrule\@width\hsize\@height\z@ % possibly bad \penalty-100 % (\hrule moves depth into height) \egroup %%% {\showoutput\showbox\@tempboxa}% \begingroup \fb@put@frame\FrameCommand\FirstFrameCommand \endgroup \@minipagefalse % In case it was set and not cleared } % \fb@put@frame takes the contents of \@tempboxa and puts all, or a piece, % of it on the page with a frame (\FrameCommand, \FirstFrameCommand, % \MidFrameCommand, or \LastFrameCommand). It recurses until all of % \@tempboxa has been used up. (\@tempboxa must have zero depth.) % #1 = attempted framing command, if no split % #2 = framing command if split % First iteration: Try to fit with \FrameCommand. If it does not fit, % split for \FirstFrameCommand. % Later iteration: Try to fit with \LastFrameCommand. If it does not % fit, split for \MidFrameCommand. \def\fb@put@frame#1#2{\relax \ifdim\pagegoal=\maxdimen \pagegoal\vsize \fi | \message{=============== Entering putframe ====================^^J | \pagegoal=\the\pagegoal, \pagetotal=\the\pagetotal. }% \ifinner \fb@putboxa#1% \fb@afterframe \else \dimen@\pagegoal \advance\dimen@-\pagetotal % natural space left on page \ifdim\dimen@<2\baselineskip % Too little room on page | \message{Page has only \the\dimen@\space room left; eject. }% \eject \fb@adjheight \fb@put@frame#1#2% \else % there's appreciable room left on the page \fb@sizeofframe#1% | \message{\string\pagetotal=\the\pagetotal, | \string\pagegoal=\the\pagegoal, | \string\pagestretch=\the\pagestretch, | \string\pageshrink=\the\pageshrink, | \string\fb@frh=\the\fb@frh. \space} | \message{^^JBox of size \the\ht\@tempboxa\space}% \begingroup % temporarily set \dimen@ to be... \advance\dimen@.8\pageshrink % maximum space available on page \advance\dimen@-\fb@frh\relax % max space available for frame's contents %%% LOOKS SUBTRACTED AND ADDED, SO DOUBLE ACCOUNTING! \expandafter\endgroup % expand \ifdim, then restore \dimen@ to real room left on page \ifdim\dimen@>\ht\@tempboxa % whole box does fit | \message{fits in \the\dimen@. }% % ToDo: Change this to use vsplit anyway to capture the marks % MERGE THIS WITH THE else CLAUSE!!! \fb@putboxa#1% \fb@afterframe \else % box must be split | \message{must be split to fit in \the\dimen@. }% % update frame measurement to use \FirstFrameCommand or \MidFrameCommand \fb@sizeofframe#2% \setbox\@tempboxa\vbox{% simulate frame and flexiblity of the page: \vskip \fb@frh \@plus\pagestretch \@minus.8\pageshrink \kern137sp\kern-137sp\penalty-30 \unvbox\@tempboxa}% \edef\fb@resto@set{\boxmaxdepth\the\boxmaxdepth \splittopskip\the\splittopskip}% \boxmaxdepth\z@ \splittopskip\z@ | \message{^^JPadded box of size \the\ht\@tempboxa\space split to \the\dimen@}% % Split box here \setbox\tw@\vsplit\@tempboxa to\dimen@ | \toks99\expandafter{\splitfirstmark}% | \toks98\expandafter{\splitbotmark}% | \message{Marks are: \the\toks99, \the\toks98. }% \setbox\tw@\vbox{\unvbox\tw@}% natural-sized | \message{Natural height of split box is \the\ht\tw@, leaving | \the\ht\@tempboxa\space remainder. }% % If the split-to size > (\vsize-\topskip), then set box to full size. \begingroup \advance\dimen@\topskip \expandafter\endgroup \ifdim\dimen@>\pagegoal | \message{Frame is big -- Use up the full column. }% \dimen@ii\pagegoal \advance\dimen@ii -\topskip \advance\dimen@ii \FrameHeightAdjust\relax \else % suspect this is implemented incorrectly: % If the split-to size > feasible room_on_page, rebox it smaller. \advance\dimen@.8\pageshrink \ifdim\ht\tw@>\dimen@ | \message{Box too tall; rebox it to \the\dimen@. }% \dimen@ii\dimen@ \else % use natural size \dimen@ii\ht\tw@ \fi \fi % Re-box contents to desired size \dimen@ii \advance\dimen@ii -\fb@frh \setbox\tw@\vbox to\dimen@ii \bgroup % remove simulated frame and page flexibility: \vskip -\fb@frh \@plus-\pagestretch \@minus-.8\pageshrink \unvbox\tw@ \unpenalty\unpenalty \ifdim\lastkern=-137sp % whole box went to next page | \message{box split at beginning! }% % need work here??? \egroup \fb@resto@set \eject % (\vskip for frame size was discarded) \fb@adjheight \fb@put@frame#1#2% INSERTED ??? \else % Got material split off at the head \egroup \fb@resto@set \ifvoid\@tempboxa % it all fit after all | \message{box split at end! }% \setbox\@tempboxa\box\tw@ \fb@putboxa#1% \fb@afterframe \else % it really did split | \message{box split as expected. Its reboxed height is \the\ht\tw@. }% \ifdim\wd\tw@>\z@ \wd\tw@\wd\@tempboxa \centerline{#2{\box\tw@}}% ??? \centerline bad idea \else | \message{Zero width means likely blank. Don't frame it (guess)}% \box\tw@ \fi \hrule \@height\z@ \@width\hsize \eject \fb@adjheight \fb@put@frame\LastFrameCommand\MidFrameCommand \fi\fi\fi\fi\fi } \def\fb@putboxa#1{% \ifvoid\@tempboxa \PackageWarning{framed}{Boxa is void -- discard it. }% \else | \message{Frame and place boxa. }% | %{\showoutput\showbox\@tempboxa}% \centerline{#1{\box\@tempboxa}}% \fi } \def\fb@afterframe{% \nointerlineskip \null %{\showoutput \showlists} \penalty-30 \vskip\OuterFrameSep \relax } % measure width and height added by frame (#1 = frame command) % call results \fb@frw and \fb@frh % todo: a mechanism to handle wide frame titles \newdimen\fb@frw \newdimen\fb@frh \def\fb@sizeofframe#1{\begingroup \setbox\z@\vbox{\vskip-5in \hbox{\hskip-5in #1{\hbox{\vrule \@height 4.7in \@depth.3in \@width 5in}}}% \vskip\z@skip}% | \message{Measuring frame addition for \string#1 in \@currenvir\space | gives ht \the\ht\z@\space and wd \the\wd\z@. }% | %{\showoutput\showbox\z@}% \global\fb@frw\wd\z@ \global\fb@frh\ht\z@ \endgroup } \def\fb@adjheight{% \vbox to\FrameHeightAdjust{}% get proper baseline skip from above. \penalty\@M \nointerlineskip \vskip-\FrameHeightAdjust \penalty\@M} % useful for tops of pages \edef\zero@glue{\the\z@skip} \catcode`\|=\FrameRestore % Provide configuration commands: \providecommand\FrameCommand{% \setlength\fboxrule{\FrameRule}\setlength\fboxsep{\FrameSep}% \fbox} \@ifundefined{FrameRule}{\newdimen\FrameRule \FrameRule=\fboxrule}{} \@ifundefined{FrameSep} {\newdimen\FrameSep \FrameSep =3\fboxsep}{} \providecommand\FirstFrameCommand{\FrameCommand} \providecommand\MidFrameCommand{\FrameCommand} \providecommand\LastFrameCommand{\FrameCommand} % Height of frame above first baseline when frame starts a page: \providecommand\FrameHeightAdjust{6pt} % \FrameRestore has parts of \@parboxrestore, performing a similar but % less complete restoration of the default layout. See how it is used in % the "settings" argument of \MakeFrame. Though not a parameter, \hsize % should be set to the desired total line width available inside the % frame before invoking \FrameRestore. \def\FrameRestore{% \let\if@nobreak\iffalse \let\if@noskipsec\iffalse \let\-\@dischyph \let\'\@acci\let\`\@accii\let\=\@acciii % \message{FrameRestore: % \@totalleftmargin=\the \@totalleftmargin, % \rightmargin=\the\rightmargin, % \@listdepth=\the\@listdepth. }% % Test if we are in a list (or list-like paragraph) \ifnum \ifdim\@totalleftmargin>\z@ 1\fi \ifdim\rightmargin>\z@ 1\fi \ifnum\@listdepth>\z@ 1\fi 0>\z@ % \message{In a list: \linewidth=\the\linewidth, \@totalleftmargin=\the\@totalleftmargin, % \parshape=\the\parshape, \columnwidth=\the\columnwidth, \hsize=\the\hsize, % \labelwidth=\the\labelwidth. }% \@setminipage % snug fit around the item. I would like this to be non-global. % Now try to propageate changes of width from \hsize to list parameters. % This is deficient, but a more advanced way to indicate modification to text % dimensions is not (yet) provided; in particular, no separate left/right % adjustment. \advance\linewidth-\columnwidth \advance\linewidth\hsize \parshape\@ne \@totalleftmargin \linewidth \else % Not in list \linewidth=\hsize %\message{No list, set \string\linewidth=\the\hsize. }% \fi \sloppy } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% expint/vignettes/expint.Rnw0000644000176200001440000004113214326667517015612 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage{microtype} \usepackage[scaled=0.92]{helvet} \usepackage[sc]{mathpazo} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{expint user manual} %\VignettePackage{expint} %\SweaveUTF8 \title{\pkg{expint}: Exponential integral and incomplete gamma function} \author{Vincent Goulet \\ Université Laval} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Additional commands similar to those of RJournal.sty. \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\samp}[1]{{`\normalfont\texttt{#1}'}} \newcommand{\file}[1]{{`\normalfont\textsf{#1}'}} \newcommand{\Ei}{\operatorname{Ei}} \bibliographystyle{plainnat} <>= library(expint) options(width = 60) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} The exponential integral \begin{equation*} E_1(x) = \int_x^\infty \frac{e^{-t}}{t}\, dt, \quad x \in \mathbb{R} \end{equation*} and the incomplete gamma function \begin{equation*} \Gamma(a, x) = \int_x^\infty t^{a-1} e^{-t}\, dt, \quad x > 0, \quad a \in \mathbb{R} \end{equation*} are two closely related functions that arise in various fields of mathematics. \pkg{expint} is a small package that intends to fill a gap in R's support for mathematical functions by providing facilities to compute the exponential integral and the incomplete gamma function. Furthermore, and perhaps most conveniently for R package developers, the package also gives easy access to the underlying C workhorses through an API. The C routines are derived from the GNU Scientific Library \citep[GSL;][]{GSL}. Package \pkg{expint} started its life in version~2.0-0 of package \pkg{actuar} \citep{actuar} where we extended the range of admissible values in the computation of limited expected value functions. This required an incomplete gamma function that accepts negative values of argument $a$, as explained at the beginning of Appendix~A of \citet{LossModels4e}. \section{Exponential integral} \label{sec:expint} \citet[Section~5.1]{Abramowitz:1972} first define the exponential integral as \begin{equation} \label{eq:E1} E_1(x) = \int_x^\infty \frac{e^{-t}}{t}\, dt. \end{equation} An alternative definition (to be understood in terms of the Cauchy principal value due to the singularity of the integrand at zero) is \begin{equation*} \Ei(x) = - \int_{-x}^\infty \frac{e^{-t}}{t}\, dt = \int_{-\infty}^x \frac{e^t}{t}\, dt, \quad x > 0. \end{equation*} The above two definitions are related as follows: \begin{equation} \label{eq:Ei_vs_E1} E_1(-x) = - \Ei(x), \quad x > 0. \end{equation} The exponential integral can also generalized to \begin{equation*} E_n(x) = \int_1^\infty \frac{e^{-xt}}{t^n}\, dt, \quad n = 0, 1, 2, \dots, \quad x > 0, \end{equation*} where $n$ is then the \emph{order} of the integral. The latter expression is closely related to the incomplete gamma function (\autoref{sec:gammainc}) as follows: \begin{equation} \label{eq:En_vs_gammainc} E_n(x) = x^{n - 1} \Gamma(1 - n, x). \end{equation} One should note that the first argument of function $\Gamma$ is negative for $n > 1$. The following recurrence relation holds between exponential integrals of successive orders: \begin{equation} \label{eq:En:recurrence} E_{n+1}(x) = \frac{1}{n} [e^{-x} - x E_n(x)]. \end{equation} Finally, $E_n(x)$ has the following asymptotic expansion: \begin{equation} \label{eq:En:asymptotic} E_n(x) \asymp \frac{e^{-x}}{x} \left( 1 - \frac{n}{x} + \frac{n(n+1)}{x^2} - \frac{n(n+1)(n+2)}{x^3} + \dots \right). \end{equation} \section{Incomplete gamma function} \label{sec:gammainc} From a probability theory perspective, the incomplete gamma function is usually defined as \begin{equation*} P(a, x) = \frac{1}{\Gamma(a)} \int_0^x t^{a - 1} e^{-t}\, dt, \quad x > 0, \quad a > 0. \end{equation*} Function \code{pgamma} already implements this function in R (just note the differing order of the arguments). Now, the definition of the incomplete gamma function of interest for this package is rather the following \citep[Section~6.5]{Abramowitz:1972}: \begin{equation} \label{eq:gammainc} \Gamma(a, x) = \int_x^\infty t^{a-1} e^{-t}\, dt, \quad x > 0, \quad a \in \mathbb{R}. \end{equation} Note that $a$ can be negative with this definition. Of course, for $a > 0$ one has \begin{equation} \label{eq:gammainc_vs_pgamma} \Gamma(a, x) = \Gamma(a) [1 - P(a, x)]. \end{equation} Integration by parts of the integral in \eqref{eq:gammainc} yields the relation \begin{equation*} \Gamma(a, x) = -\frac{x^a e^{-x}}{a} + \frac{1}{a} \Gamma(a + 1, x). \end{equation*} When $a < 0$, this relation can be used repeatedly $k$ times until $a + k$ is a positive number. The right hand side can then be evaluated with \eqref{eq:gammainc_vs_pgamma}. If $a = 0, -1, -2, \dots$, this calculation requires the value of \begin{equation*} G(0, x) = \int_x^\infty \frac{e^{-t}}{t}\, dt = E_1(x), \end{equation*} the exponential integral defined in \eqref{eq:E1}. \section{R interfaces} \label{sec:interfaces} Package \pkg{expint} provides one main and four auxiliary R functions to compute the exponential integral, and one function to compute the incomplete gamma function. Their signatures are the following: \begin{Schunk} \begin{Sinput} expint(x, order = 1L, scale = FALSE) expint_E1(x, scale = FALSE) expint_E2(x, scale = FALSE) expint_En(x, order, scale = FALSE) expint_Ei(x, scale = FALSE) gammainc(a, x) \end{Sinput} \end{Schunk} Let us first go over function \code{gammainc} since there is less to discuss. The function takes in argument two vectors or real numbers (non-negative for argument \code{x}) and returns the value of $\Gamma(a, x)$. The function is vectorized in arguments \code{a} and \code{x}, so it works similar to, say, \code{pgamma}. We now turn to the \code{expint} family of functions. Function \code{expint} is a unified interface to compute exponential integrals $E_n(x)$ of any (non-negative) order, with default the most common case $E_1(x)$. The function is vectorized in arguments \code{x} and \code{order}. In other words, one can compute the exponential integral of a different order for each value of $x$. <>= expint(c(1.275, 10, 12.3), order = 1:3) @ Argument \code{order} should be a vector of integers. Non-integer values are silently coerced to integers using truncation towards zero. When argument \code{scale} is \code{TRUE}, the result is scaled by $e^{x}$. Functions \code{expint\_E1}, \code{expint\_E2} and \code{expint\_En} are simpler, slightly faster ways to directly compute exponential integrals $E_1(x)$, $E_2(x)$ and $E_n(x)$, the latter for a \emph{single} order $n$ (the first value of \code{order} if \code{order} is a vector). <>= expint_E1(1.275) expint_E2(10) expint_En(12.3, order = 3L) @ Finally, function \code{expint\_Ei} is provided as a convenience to compute $\Ei(x)$ using \eqref{eq:Ei_vs_E1}. <>= expint_Ei(5) -expint_E1(-5) # same @ \section{Accessing the C routines} \label{sec:api} The actual workhorses behind the R functions of \autoref{sec:interfaces} are C routines with the following prototypes: \begin{Schunk} \begin{Sinput} double expint_E1(double x, int scale); double expint_E2(double x, int scale); double expint_En(double x, int order, int scale); double gamma_inc(double a, double x); \end{Sinput} \end{Schunk} Package \pkg{expint} makes these routines available to other packages through declarations in the header file \file{include/expintAPI.h} in the package installation directory. The developer of some package \pkg{pkg} who wants to use a routine --- say \code{expint\_E1} --- in her code should proceed as follows. \begin{enumerate} \item Add package \pkg{expint} to the \code{Imports} and \code{LinkingTo} directives of the \file{DESCRIPTION} file of \pkg{pkg}; \item Add an entry \samp{import(expint)} in the \file{NAMESPACE} file of \pkg{pkg}; \item Define the routine with a call to \code{R\_GetCCallable} in the initialization routine \code{R\_init\_pkg} of \pkg{pkg} \citep[Section~5.4]{WRE}. For the current example, the file \file{src/init.c} of \pkg{pkg} would contain the following code: \begin{Schunk} \begin{Sinput} void R_init_pkg(DllInfo *dll) { R_registerRoutines( /* native routine registration */ ); pkg_expint_E1 = (double(*)(double,int,int)) R_GetCCallable("expint", "expint_E1"); } \end{Sinput} \end{Schunk} \item Define a native routine interface that will call \code{expint\_E1}, say \code{pkg\_expint\_E1} to avoid any name clash, in \file{src/init.c} as follows: \begin{Schunk} \begin{Sinput} double(*pkg_expint_E1)(double,int); \end{Sinput} \end{Schunk} \item Declare the routine in a header file of \pkg{pkg} with the keyword \code{extern} to expose the interface to all routines of the package. In our example, file \file{src/pkg.h} would contain: \begin{Schunk} \begin{Sinput} extern double(*pkg_expint_E1)(double,int); \end{Sinput} \end{Schunk} \item Include the package header file \file{pkg.h} in any C file making use of routine \code{pkg\_expint\_E1}. \end{enumerate} To help developers get started, \pkg{expint} ships with a complete test package implementing the above; see the \file{example\_API} sub-directory in the installation directory. This test package uses the \code{.External} R to C interface and, as a bonus, shows how to vectorize an R function on the C side (the code for this being mostly derived from base R). There are various ways to define a package API. The approach described above was derived from package \pkg{zoo} \citep{zoo}. Package \pkg{xts} \citep{xts} --- and probably a few others on CRAN --- draws from \pkg{Matrix} \citep{Matrix} to propose a somewhat simpler approach where the API exposes routines that can be used directly in a package. However, the provided header file can be included only once in a package, otherwise one gets \samp{duplicate symbols} errors at link time. This constraint does no show in the example provided with \pkg{xts} or in packages \pkg{RcppXts} \citep{RcppXts} and \pkg{TTR} \citep{TTR} that link to it (the only two at the time of writing). A way around the issue is to define a native routine calling the routines exposed in the API. In this scenario, tests we conducted proved the approach we retained to be up to 10\% faster most of the time. \section{Implementation details} \label{sec:implementation} As already stated, the C routines mentioned in \autoref{sec:api} are derived from code in the GNU Scientific Library \citep{GSL}. For exponential integrals, the main routine \code{expint\_E1} computes $E_1(x)$ using Chebyshev expansions \citep[chapter~3]{Gil:2007}. Routine \code{expint\_E2} computes $E_2(x)$ using \code{expint\_E1} with relation \eqref{eq:En:recurrence} for $x < 100$, and using the asymptotic expression \eqref{eq:En:asymptotic} otherwise. Routine \code{expint\_En} simply relies on \code{gamma\_inc} to compute $E_n(x)$ for $n > 2$ through relation \eqref{eq:En_vs_gammainc}. For the sake of providing routines that better fit within the R ecosystem and coding style, we made the following changes to the original GSL code: \begin{enumerate} \item routines now compute a single value and return their result by value; \item accordingly, calculation of the approximation error was dropped in all routines; \item most importantly, \code{gamma\_inc} does not compute $\Gamma(a, x)$ for $a > 0$ with \eqref{eq:gammainc_vs_pgamma} using the GSL routines, but rather using routines \code{gammafn} and \code{pgamma} part of the R API. \end{enumerate} The following illustrates the last point. <>= op <- options() # remember default number of digits @ <>= options(digits = 20) gammainc(1.2, 3) gamma(1.2) * pgamma(3, 1.2, 1, lower = FALSE) @ <>= options(op) # restore defaults @ \section{Alternative packages} \label{sec:alternatives} The Comprehensive R Archive Network\footnote{% \url{https://cran.r-project.org}} % (CRAN) contains a number of packages with features overlapping \pkg{expint}. We review the similarities and differences here. The closest package in functionality is \pkg{gsl} \citep{gsl-package}. This package is an R wrapper for the special functions and quasi random number generators of the GNU Scientific Library. As such, it provides access to basically the same C code as used in \pkg{expint}. Apart from the changes to the GSL code mentioned in \autoref{sec:implementation}, the main difference between the two packages is that \pkg{gsl} requires that the GSL be installed on one's system, whereas \pkg{expint} is a regular, free standing R package. Package \pkg{VGAM} \citep{VGAM} is a large, high quality package that provides functions to compute the exponential integral $\Ei(x)$ for real values, as well as $e^{-x} \Ei(x)$ and $E_1(x)$ and their derivatives (up to the third derivative). Functions \code{expint}, \code{expexpint} and \code{expint.E1} are wrappers to the Netlib\footnote{% \url{http://www.netlib.org}} % FORTRAN subroutines in file \code{ei.f}. \pkg{VGAM} does not provide an API to its C routines. Package \pkg{pracma} \citep{pracma} provides a large number of functions from numerical analysis, linear algebra, numerical optimization, differential equations and special functions. Its versions of \code{expint}, \code{expint\_E1}, \code{expint\_Ei} and \code{gammainc} are entirely written in R with perhaps less focus on numerical accuracy than the GSL and Netlib implementations. The version of \code{gammainc} only supports positive values of $a$. Package \pkg{frmqa} \citep{frmqa} has a function \code{gamma\_inc\_err} that computes the incomplete gamma function using the incomplete Laplace integral, but it is only valid for $a = j + \frac{1}{2}$, $j = 0, 1, 2, \dots$. Package \pkg{zipfR} \citep{zipfR} introduces a set of functions to compute various quantities related to the gamma and incomplete gamma functions, but these are essentially wrappers around the base R functions \code{gamma} and \code{pgamma} with no new functionalities. \section{Examples} \label{sec:examples} We tabulate the values of $E_n(x)$ for $x = 1.275, 10, 12.3$ and $n = 1, 2, \dots, 10$ as found in examples~4--6 of \citet[section~5.3]{Abramowitz:1972}. <>= x <- c(1.275, 10, 12.3) n <- 1:10 structure(t(outer(x, n, expint)), dimnames = list(n, paste("x =", x))) @ We also tabulate the values of $\Gamma(a, x)$ for $a = -1.5, -1, -0.5, 1$ and $x = 1, 2, \dots, 10$. <>= a <- c(-1.5, -1, -0.5, 1) x <- 1:10 structure(t(outer(a, x, gammainc)), dimnames = list(x, paste("a =", a))) @ \section{Acknowledgments} We built on the source code of R and many of the packages cited in this paper to create \pkg{expint}, so the R Core Team and the package developers deserve credit. We also extend our thanks to Dirk Eddelbuettel who was of great help in putting together the package API, through both his posts in online forums and private communication. Joshua Ulrich provided a fix to the API infrastructure to avoid duplicated symbols that was implemented in version 0.1-6 of the package. \bibliography{expint} \end{document} expint/vignettes/expint.bib0000644000176200001440000001115514220225222015552 0ustar liggesusers@Book{Abramowitz:1972, author = {Abramowitz, M. and Stegun, I. A.}, title = {Handbook of Mathematical Functions}, publisher = {Dover}, year = 1972, url = {http://people.math.sfu.ca/~cbm/aands/}, language = {english} } @Manual{GSL, title = {{GNU} Scientific Library Reference Manual}, author = {Galassi, M. and Davies, J. and Theiler, J. and Gough, B. and Jungman, G. and Alken P. and Booth, M. and Rossi, F. and Ulerich, R.}, edition = {Third}, year = 2009, isbn = {0-95461207-8}, url = {https://www.gnu.org/software/gsl/}, language = {english} } @Book{Gil:2007, author = {Gil, A. and Segura, J. and Temme, N. M.}, title = {Numerical Methods for Special Functions}, publisher = {Society for Industrial and Applied Mathematics}, year = 2007, isbn = {978-0-89871634-4}, url = {http://dx.doi.org/10.1137/1.9780898717822}, language = {english} } @Book{LossModels4e, author = {Klugman, S. A. and Panjer, H. H. and Willmot, G.}, title = {Loss Models: From Data to Decisions}, edition = 4, publisher = {Wiley}, year = 2012, address = {New York}, isbn = {978-1-11831532-3}, language = {english} } @Manual{Matrix, title = {Matrix: Sparse and Dense Matrix Classes and Methods}, author = {D. Bates and M. Maechler}, year = 2016, note = {R package version 1.2-7.1}, url = {https://CRAN.R-project.org/package=Matrix}, language = {english} } @Manual{RcppXts, title = {RcppXts: Interface the xts API via Rcpp}, author = {D. Eddelbuettel}, year = 2013, note = {R package version 0.0.4}, url = {https://CRAN.R-project.org/package=RcppXts}, language = {english} } @Manual{TTR, title = {TTR: Technical Trading Rules}, author = {J. Ulrich}, year = 2016, note = {R package version 0.23-1}, url = {https://CRAN.R-project.org/package=TTR}, language = {english} } @Book{VGAM, author = {Yee, T. W.}, title = {Vector Generalized Linear and Additive Models: With an Implementation in {R}}, publisher = {Springer}, year = 2015, isbn = {978-1-49392818-7}, url = {https://cran.r-project.org/package=VGAM}, language = {english} } @Manual{WRE, title = {Writing {R} Extensions}, author = {{R Core Team}}, year = 2016, note = {Manual for {R} version 3.3.2}, url = {https://cran.r-project.org/doc/manuals/R-exts.html}, language = {english}} @Article{actuar, author = {Dutang, C. and Goulet, V. and Pigeon, M.}, title = {\pkg{actuar}: An {R} Package for Actuarial Science}, journal = {Journal of Statistical Software}, year = 2008, volume = 25, number = 7, url = {http://www.jstatsoft.org/v25/i07}, language = {english} } @Manual{frmqa, title = {\pkg{frmqa}: The Generalized Hyperbolic Distribution, Related Distributions and Their Applications in Finance}, author = {Thanh T. Tran}, year = 2012, note = {R package}, url = {https://cran.r-project.org/package=frmqa}, language = {english} } @Article{gsl-package, title = {Special functions in {R}: introducing the \pkg{gsl} package}, author = {Hankin, R. K. S.}, journal = {R News}, year = {2006}, month = {October}, volume = {6}, issue = {4}, language = {english} } @Manual{pracma, title = {\pkg{pracma}: Practical Numerical Math Functions}, author = {Borchers, H. W.}, year = {2016}, note = {R package}, url = {https://cran.r-project.org/package=pracma}, language = {english} } @Manual{xts, title = {xts: {eXtensible} Time Series}, author = {J. A. Ryan and J. M. Ulrich}, year = 2014, note = {R package version 0.9-7}, url = {https://CRAN.R-project.org/package=xts}, language = {english} } @InProceedings{zipfR, title = {\pkg{zipfR}: Word Frequency Distributions in {R}}, author = {Evert, S. and Baroni, M.}, booktitle = {Proceedings of the 45\textsuperscript{th} Annual Meeting of the Association for Computational Linguistics, Posters and Demonstrations Sessions}, address = {Prague, Czech Republic}, year = {2007}, pages = {29--32}, note = {R package}, url = {https://cran.r-project.org/package=zipfR}, language = {english} } @Article{zoo, title = {zoo: S3 Infrastructure for Regular and Irregular Time Series}, author = {A. Zeileis and G. Grothendieck}, journal = {Journal of Statistical Software}, year = 2005, volume = 14, number = 6, pages = {1--27}, doi = {10.18637/jss.v014.i06}, language = {english} } expint/R/0000755000176200001440000000000014220225222011753 5ustar liggesusersexpint/R/gammainc.R0000644000176200001440000000054414220225222013655 0ustar liggesusers### == expint: Exponential Integral and Incomplete Gamma Function == ### ### The incomplete gamma function ### ### G(a,x) = int_x^infty t^{a-1} exp(-t) dt ### ### for a *real* and x >= 0. Note the order of the arguments. ### ### AUTHOR: Vincent Goulet gammainc <- function(a, x) .External(C_expint_do_gammainc, a, x) expint/R/expint.R0000644000176200001440000000203714220225222013407 0ustar liggesusers### == expint: Exponential Integral and Incomplete Gamma Function == ### ### Functions to compute the exponential integral Ei and the ### exponential integral of order 'n = 1, 2, ...' ### ### E_n = int_x^infty exp(-t)/t^n dt. ### ### Function 'expint' is a unified and fully vectorized interface with ### default the most common case E_1. The other functions are simpler, ### slightly faster interfaces to E_1, E_2, E_n and Ei. ### ### When 'scale' is TRUE, the value returned is scaled by exp(x). ### ### AUTHOR: Vincent Goulet expint <- function(x, order = 1L, scale = FALSE) .External(C_expint_do_expint, "En", x, order, scale) expint_E1 <- function(x, scale = FALSE) .External(C_expint_do_expint, "E1", x, scale) expint_E2 <- function(x, scale = FALSE) .External(C_expint_do_expint, "E2", x, scale) expint_En <- function(x, order, scale = FALSE) .External(C_expint_do_expint, "En", x, order[1L], scale) expint_Ei <- function(x, scale = FALSE) -.External(C_expint_do_expint, "E1", -x, scale) expint/MD50000644000176200001440000000374314326736253012113 0ustar liggesusers47a674628bf796782869925b413b37db *DESCRIPTION 5f8a7f85a3e0abba979c1c9979b8b00f *NAMESPACE d7c07c6689aa28184a4df0b6325cabc1 *R/expint.R 7471ef9868ba408f12a5a498e58501f7 *R/gammainc.R 9657468b5eecbb01c092b3e62e3051a4 *build/partial.rdb 8f919d5269f07caa0b0b2e2375572020 *build/vignette.rds e61c706fdbd70de49569afb91a0e7196 *inst/CITATION b660f459e5e4739aa1287f0b3297234d *inst/NEWS.Rd 07f1c5fda5df1a8c1f62e5f379cf3e1b *inst/doc/expint.R 4ade9567dabc3fcf0df62c94b30198de *inst/doc/expint.Rnw 4eae3eab5df5021a1ca5e924a0d0451e *inst/doc/expint.pdf d7d472fd5b250cb674d8346b0a542d62 *inst/example_API/DESCRIPTION 3369a2d761d00f69ff6cd4d7239100e3 *inst/example_API/NAMESPACE b5da8158d9ed99f4ea41439428aa0a59 *inst/example_API/R/pkg.R 0e2eb3df0ea6c5c8390f57cfbd4a144a *inst/example_API/man/pkg.Rd 40df19637b270a88d3d38bf46bf91548 *inst/example_API/src/bar.c 9951c44ab3127c3be39de8874b104e98 *inst/example_API/src/foo.c 389d2bce80b57f560da3aaf2d1b11502 *inst/example_API/src/init.c b6d56cad2a4918add4ffec77171ac36e *inst/example_API/src/locale.h 3d2f0b06e8d1485c694ded0525962d94 *inst/example_API/src/pkg.h 779de94c41564597814c2f91ac086985 *inst/include/expintAPI.h 0028cb1f88b81fd2fdc9534a96fe3574 *man/expint-package.Rd f46559b620171a5da7757a0ed91b3bbd *man/expint.Rd bf718b5610becfb0d36c8973b6a033e3 *man/gammainc.Rd 6b54a96e4ca97a3772256cec4d3173a9 *po/expint.pot 5d933ad1edf844e2ed62127c60d30954 *po/fr.po 9b1fc46b8311156241488e0d836933b0 *src/Makevars 6313c8359e44eb28461254671b88263b *src/expint.c 347f3be0a0d3a7efdcb696bdf8379fdd *src/expint.h 34c020ee3e91866ff7ade3ae9389d204 *src/gamma_inc.c 94a10521f6882d1cd70a9c97b5446c97 *src/init.c 87053b6138fe649fec962930ee98a47e *src/locale.h 40c5dc5621a325aca8b61d06834d65e4 *tests/expint-tests.R 74da2d8eefe8bd2b4004f2d3e05f4e63 *tests/gammainc-tests.R f11fed9e9bad440de80e91ea4aab5451 *vignettes/auto/expint.el 4ade9567dabc3fcf0df62c94b30198de *vignettes/expint.Rnw 177eabb05ee9501ac389a697f114f4fe *vignettes/expint.bib 7ec15c16d0d66790f28e90343c5434a3 *vignettes/framed.sty expint/inst/0000755000176200001440000000000014326667553012557 5ustar liggesusersexpint/inst/doc/0000755000176200001440000000000014326667553013324 5ustar liggesusersexpint/inst/doc/expint.pdf0000644000176200001440000051342214326667553015335 0ustar liggesusers%PDF-1.5 % 49 0 obj << /Length 1885 /Filter /FlateDecode >> stream xX[s~[;vڙmI餻NWeN(R!)_RM/p\_潵 gJ&7 dYh<&PꗛyϨKK2fqM]}W5,bӛfpƓ5gĂg<M_6D *ŝ\&LJ_+(8\7Gւ(&5(맺_ImW? ®Jxe5Ȍ%kɈg(wu6LuKDPh9h{sWEGNM81F:-XޝdfDeS*Л F&a%M~.C<,B:lsM<Ā9hY8.܎t|b%(K,1߉6H5B-O=k/ttJo|g(s$&-DQĈRW*rJYKlqhqc K \! Մ(G2_F L|}}!w3k/YY:R:/ԑ~}e#N`4 \Fhj MG߲ u8;LeO^_O%TTלyt^scYeIw ˒,s3"VM*ݮT4m`S5]Q='؞y7 C-%7m#5"̋jGms ~MGc#Byp& |/L; jg;K("nWU9_]惍n56꛰ayM|Cen6=(|W'Nϓ\w"L )K?KC$dݗ۲ޅ|SVe_]`ѡ+r "kPS  1;7)u"}lEOgߛ3"=`.?tA̾'ѱJ=ijt0.aq8?g}7-VaW@v&,y5߮ 0,1MY!:F#Doec-Ս ,C5m"?|&ww4ߑf0}Yصoĭ'ϔTyw-OGҕ&^mB0ß|;ĝ٭SOw^]Wn~ĝ68v5IF8B 8c<WG;yA)hxB~ ]ӰxZ`71o_@JJZơѻo>G_K)u6{ۅ؛;:W;/F>ݟZask/Hr;愿Gx9KK4\#o"AU/}vz#~3蠙:ѭ+Ko{dG9r23>]hh$ǃOc b_n 8;zG6tgj/e-<%dTέr`6/#@6Ů链လ*h\|^w~ G}8ԋp8H6 pgԛwΝoqx4,81f#0p %~s8Ȋ1MEZöʶpúK1f򔝹I F׽N׽NN]x_:]wLi0_:NO^xS1r&pPµnNiw8 endstream endobj 75 0 obj << /Length 2783 /Filter /FlateDecode >> stream xZ[۶~_Gjb_2Τ<$OrWjV}.$ <w.}W8\v}7 #, o )B )Lf6պ9QeSfr[6v m?`ۍ'Mhonln}|͝.Ïg]5c} $r36QmƬ{ۉ!mwIJex[5u] '@bմjncܔ+ vN*JTSs ¼^/y ӄXDkcuֵ"p9=e+6-q[RQ=0^2LA(B! f >P.qڸsfMN^%JfJ 抄Y#lx$ԈlmW š2. I Y,-|  ɵ|SDR]^+DvC_Q)1 B ,&'׃UV+HCn 2$YGFu|."ӋHG* VfB&,df3KrnL.7irKv %ȪT ^eS2k574ۮ FNP  MxaZuQ(i!ewLtmjCz:>;a0El,8Z |=LjXr4'H$ fU<|$Y3VeMЀd+3ۜe$29.7=  Rg%On81]E]mM W_: 3G!`䁅\fR BcY8pVfS_>MsU*dcO des:%6(n‘r0,$S)UfsNqYˣ{wSݬ֮n߁SQ<\ fzm@}7nԸIR fmqPN"Me)]nEp1 Z-[4\jZIARK([_f[=/Aɸ_~ߌ+4~$F|D>Nm~ F_yA9h^s[s)C=M$5a_I21?e~s4`qe`Sw8* \2ʩJ\ܹ4BsZ)^rThџ S`n)c@wtRxdowE- c*]t֕CCߜhO(CLy?UJЗ)Wsѫk:ntyآ=ebW}B䀲R14X endstream endobj 87 0 obj << /Length 2940 /Filter /FlateDecode >> stream xZmBetD1h %HeMBg˻Ʋs}^(^o!<3t<$YM<Ӊe6yrN*"ɵaB~~}ywNX[H>S?[toLgSɞ^~sE@YEq?s]mVdB3ؘYY$wMGX$V? \a{2!gDYAx) 8hc+ELuSC˲_UVSUƥLLV~¦dƃ C7H;œ"ёĻabr 9URMLeS?PP<% 6j0x?/e^8~ֻZpJ1}6"f6OD@ZmE)g ߂fGK˄LV8OHZ$p(2djofy܌3_{NA@T= PȲ6q> 4+1:yH  s~y%M lgPcpN@ҷKuǘ2AbL^+G|_>Tg p tK RtH6_t&a:BԾ-(e%5ֻ>t?֛γ{͒ܩO^Oǃ<4"c`br? k=󫻗~M?n(U`[!$QCSQIY6'uũ[V90\P5'VI6t\x#P"RqfrǥLĬ !k+G+5?S\E& Gh7| 4+ՁMՆ!pmL X" ""GHE]-^ ݋ۇqx&I>j:f5C9Ie(B$aOO± /9F OV޹Sm* dJ:7ZYP.JW:XKרyV3 3BOI#[?a[gP7aSlT9]П(MǜJZ}M0 9a PzS@uJ2g-O2fgmGO=Ęlu8ٌj~\XiwZiJx@.V pq_u ={8OZWx|x5Vp;R*462TzMMѩZuO23YPS#rDg Ze[G-f>\:T%7gR;K@i53BǻqZyͳI|iՕ'\|2%xhTH' 90zl]IN!(uyPOj*wkCl늷]mud2|eS:ϙV& tB:''}k#k}#4M~GXIɒgC8M嵄ńA/*"%y;$Ѥ(B+r{K+DjήѹzIV(>8(]FRH6![WJC*w xW-ŀQpx]A h.۽n+]AJ_}5$.Lr0u $Y %w]9e~?r+]}DfPY]OB|g 6cSqX n6>. 𵤇s[»-N,Y Rz8qA 9K$ X0eW㜥|Ij n> qZO%u0_rk&&w6sQH&bFK3qq=}g 73ř?\Ɓgp>SץyapGj_tņX3&X<N,q)Z Q/ wm3h_q-X1K,q!T-Lm A K& <  endstream endobj 95 0 obj << /Length 1984 /Filter /FlateDecode >> stream xڵX[~_A kvizmlZoIa]b)R)i3R.u>̹! _x$1I")VҚ%!"T1ſdX߾?"A'(#L^,..Y#-L J`HJ,Ogsqj˺&?c 'p4W''pSFlcF<R SnXv\)b~Y_-5p3OjԊžZM؊&BfbP:?f$ۺʦxQ;b߼ A Fe JL͌S4K^ܿMiijԅߺZo;ڋ˅D#"J%Sd:qC_&"cC2g#3'V-{)2`C~Z~xxm^/&2i(Sd.S@LqB0TVm(AT(=9OʜrFj 7DK$C:7 o´;O_\Ǧvem)`p\&Irx6Zg&fӚ<үHo{EZܟtcG{j3iX.eza1JS]Ncmڿ% = %09.F C(sF(q!Ƀ-o_Cyelt|7^FI<<]z|ʺg>MȨn33)0>!g U %ze(dWsUdBi_gA1e;}8P݄j1B8joBU4$>Emx4҃ VaWJlU'R WCyQ _mת͇xH=/M-A%~\:at0Ѳt5mpfs&TJf8IMլm lA;hu/P#8q}~lA9S=n(Ch݆8uA5UgTxz?E,Cim/21ݷEq sVaL"C⡺ "4oEvܸtH)s8BBVTŔ֊ںB#)bڛպt XL"ЦcV~v`ќ0*(END+b2CQexu{aqD~)־%bEan9d8E Un>*p)r\CӖ{ujt+K{<4kI Guh'q&hO?~ =WSpL~9oCG!m@ATh+M0zf\k]V@#Uh@z{tWWٞD+Ȁp5g$pY]W `` xՓ# YLz{gW!5r\$t}"hyLtN,_A0٥O8f'&[ LC7>dsNi⁧g ?shv2v{Ț"Evㄶ=ð֕8FB>>JܙqMqi S5/(d;:i3;4h}=o?,t]nCƾ0Wl& d;8%(TOiĠW5aD"y0c)a..؅SS.| wNoꦾoW˪dJ0k4imCvfs)+!} ői(qd &Cy۵M[ze^Ph;fP]1_g?[/<܋0,_dCeYSiRse8 endstream endobj 123 0 obj << /Length 3321 /Filter /FlateDecode >> stream xZ[o~KTaM8WIQ`u[$A8@ѦPmHv~}ϙ3Cn6=\Μw.T8{W?Pafw3 B̌zv3Plf!Kb3>:f&0U>_aTiW|+f+h˛4suы,i,K&툑Z2%cb-l񆻕n"qNj`m:/VT4Zf G,=JL !GA,c1 >om"K1"Չ ڗͲ.se wЌwzC$ec(ʧyP#tub mפ.~?L)Q]S9 ZГ՘8EWᕠqІӄ}G$#J~`:eu3&)C{cdm< r}xnVcG*/sO,oIO!?sww{.Q83׹X9~Ipbjj>x\Qi桵E0 )0t!R =r̔95m뻴ֺ*> Ը

SF Pw'I0r~iu|D,dyq{9{>ju1%Qr)B:k1r蝥tv8璡rm²{7;rBgoo\13[ q4pFa|-sGd<νmRꅞ!eaY@I[Yox3| 䙿IUWGO(drC`W&jH0 o67ŲI~bO˴m ;%4cN>j- z1ّ' ,`SӼ$Djx>fR`.k}5@ $ޭ%^ڵ+.6Z/PۢtK;j*tazhtKdEc){twhAK0E?邢aZ%zXыO-6W`UL?c</S%yAy_,}Kp3Pl*zB$sfL8LBpN48#4er[pχDJW)N4s]  ]YɴT0<RٗEˀ!,ǩ8@gFWW{TPŶx@u [~0=8$&XTم?-?'Ipk~ 8M%@DKD4L;hGɂ}guF~ Į"|Hz `2súuc'2N A&cNC6A:T(Q\@wL/(nږdw-=Yݾ@9&H+P$ڤ|կzO x(*b7/ p t=q~OCIñFhk2}nԖn TgJ24< )J ^ҥK, Lvj L *8=k-? ]*2&eÄLՁlw2Z}>\lӰLS.~ξnKJO*> stream xڽZm۶~BJ'oΤ3gMu󵝎$ E$뻋Q/X`}]ۋ)IWIE8 'xqY|YxlAI&Ф `&*[xʣb.˒1]LE\\R¨vcQe 7uZNڰĢuM' #"AFt8OC$Z4~+mDhIJ/)trW32Dۺ9Ŏd m :f'!RzvrNc$QE`<*EtS|hP (( aʧv!cµr%$6޼kRG+8ƶGs(NYКZVsArERfZROHfV3X1Fء>k[4ƍ}\}A$@äۺ,%OQdU@FSYVEYĻt:4zwa>d1h{ "ӷAy@Ql7IX˄N{[ŔF+E#Eo^ix`343/mIT؏v%TŒ35M)L9Bn3}q0ܳќF{}Qx |"Fx08mL\4*;䎫ʺ3*}9 N#Mj!5` UfGC^0rcUd4Z?R4?H@BY \Ix W,S{LpSx̯nY-@>uՁ-갻3"YLF+,ظT:qwoBKELkg}2@cQޔ~c vkOЛZ/@|=Di"$%5d%hJn2 B}.GmAm+ʬ)o"%K" ak^P߾aS.}*U?DG"J~[5,S a@誵6>Rg&w5(kw}YY~ xJ6})ۡ'WH 6H|c[E5ao0qH!fɄ'#8ξtSB֓&pMF;<7lG- Hcemxmms|vYԮ|Y;DՄ!/'v JEZKQd&rP8%Л`ÝF^W}4Wޥ'O"LQF")uJT<7z`zBy>zYUnsgC$LCIʈ}}/1A}$JxllkgUV~i yT¡e.2Ra%c+~͐ 7b䔽zPχeZj ߱)K UŦ&'/dbŽe~^\] '4zfz]{zXQRϯW R@(eU^ Bp 1}^$Q"j &5]:n1KZ*t@`:ztu"G)Sx\<_ARe@OΡb/smdc5K슾-Q@i}Q):ҥ!S?WmэJ$Ub%$$:pfs7>UhpiHmLo鼻PwKHKuZL̏ 1&a8, O(BLJyӜ+0 'p `e(3++ν{ܠ lܝP?!~lZE’MPw3Sb}gY20IY+aD>HֆFi.YDbfO9 0$.6P!>;( Zÿzae|Sr`5,PRO,CC(S#eIjȤy{0B0U@PZ7`b{ R εshJ/3wx.-49G ng % 26w\0H6u$Ց4E>; X0 kYy>`HG4@a4%H&5D:Q&wmschCaca.*|PLL| OvcA49ب9>wd2$C2L-ݳ8Fh].[n2h:Ћ =I~ͿW0d K مkJ`+n꜆_XC@rGouG~0pr)s9`bxy||$;0}>8 Xk)hn5= endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 812 /Length 2433 /Filter /FlateDecode >> stream xZKoGW19lq$ MbPLjIjW3ߚ&܃՜oC1ޙh)B0 '2qC0Ap;1d#&0{,&GS)ςQv{KƔ;+8aQe@/Māf1/;8; @98SBK4x,7 pƻ`L 1ςs1 fA@`VƒMfg}1 `^e{"LƘ!ׂI7 M!#>'܈PE%BDL^`)x1buIl#6#zE؝( Q&; ".*>(uSISR4 :rrU윪L`9S R%kYDi K`r% TPI9jX+ AlP#:zUud&$A%;,C4x ߙs3|Wҗ_|^/}tΑ^>tQ/3\/Wz˸;mξ<"ț+~{>dJH/7O[5qp~?,q s]ahV'H5/Ѣ0jn,/*:/[N͇*Hړ߫Ƀmiv܇6Ю~>Cj[)F-#0>̴'ݛ8;?{O >|؊GǤy{^+֧+U>nxPg.tu^ y;1ßFד|VK5% /&ba%ᩫ!63_b=jl~[U7٧j0mЬմ!8Aɦ fw~MU`[D5Ay!V<Ҭ (JglŔ9G1Fg L%Yd5X$B@ t~ `$Jb!87jr >،ķqGk )0mZq8/[>PS_؟QVgp?l$Vgw77GI}E#( yPRuev6B9Ordb>`xR=D!aį'eSh'(D v(''_Bl# Z&5o_j7D$0EX5רZXRdH(wpyaQR`g/r[mj!i} DP:&: NE|KlnVPc3 zز| )4J #h"p [`El  v0Ӟxi]dyH5T̡Ow)(Q*i[ i fbQ.² A1a%!˺0cHRHԃVfdn 7 }ϱ&m2H4ԼlXÖ1'Cً3fYjХFUOOϫA,8T g/pX%QT15@#vb9ZJmԜ{#px> stream xڵXَ} D!rK10Iƃ)7;5[-Du$*Ml`zXܥnU"-->ݷ?8W0IԼxx*h[hxx,~.b(j>U#Ns  ZH+vѲ^,ue[}>m6e^VVS+Fc/z CaBl2d5[0JeI@$R zKiݨ7(<W q̍m.Gc4:F,)b2LGhQ2d66P+Ux-,Qj}3HfLR>uM&Pu<>\D tE:֨D:aRP%G&>/ Zq\3X ǻܔ_7]]S@.j/3|bፏSX~Mz}xݴ . ΉY<-ut#l`EuэȜ|ԋ,7m Az#q5UDc bw\aue B!*FX1u]#c{8ӡ.[?xM>__6WaRW}j{z18x/ձ nI&yNT2. NCpF ʙPtqި<,n0I-EE+Sv(D \ b,YAC$3fIHFSA{$%bD31${$M1NP(8d9$#)*uB+ `sHGbl(U9v^4wGXFf;#$FfgH#Ť,![IlvGN]h4"|L,Yz$mv. Cй]} /$k1oڀ~L019L_$2#ghA&=Gn cW L-fY w ' D{0cj<uF$0LX2B66gD_V`-ޜ'f/I%1/Z/J:|%ZN&k[zUWx w̸3NI9)p ldq#bT]dd3{[YyRzݮ4L nzͪ 7θ.֌Y5eKl"1z}I^D] B, Pb,fuJk +fy{R3aPG(sCG?EONl/`AK$q zZh_D RF4,?-3ȑ@cTt;a{tFaF&B Adpt*8,dS Q }B=3䨻%=:h?78z r]@a5?e@uD\IlRsNJTSzxpZJAGCKD{zia~J8!%:[~~/+nnڋ)742W+fa"gtX0,W|L`֧HKT$ KRGU6ml61ԇ8;fr2E7hPew( :H0r&r?WLGs-bp)S)>Aŗ TvU&U'JQeqk8F,xYsܴgIi'Ԡ}L^'> r >9|nz}}NJ_}:MQ>ۗ(4f;oMK~9YVٯk0j1=("pHk~ߦQqc{#n&aq^}H<Ż P<a endstream endobj 186 0 obj << /Length 2581 /Filter /FlateDecode >> stream xڭYr+* 3, pD&^<,ً|{<@ (ں<{{NnbDGo_o͢+L$!< a˪bTe'[ʷzYvy,)qV_Mޒ^LÅ[Ó.p{"n8JH%(5.> a6J]B;9wi묷M<9n" ;΁KaWεgљq)%f]"=%JυAJw3^萦$V9GndOܦx6HaTчziu\,Ms/Tueh{>tbp͔l̐rTU`kqD&T9Xh u4x#川V.ɞKő`>Yc wa4l9%>>?}w&E9m<2Eړ}T4V[;+ӄwC[-GfY9=NÐ㢛z//TH4N$Q۔}8/~[ 1؎r~2؞lz rـ<:f*L-6yX{$5G~X':IqKȉ'eNr߫oȼ*Á 3&)hWP'Hpq*rr=B,(`>4;<|o+v=W[OGB0qn]9x>6'i_ͪD*P4\}y]I>16,>EbvOttjk9N?K?^aI?~RX.-]q[;b`w,+ڠ0 $E2;XXUOHaс<;olIp$s6 l'+,ɂIlR/ ZƩNecXoS4kroO6"Sh?8,D--M"_U?G.L&[, Q <|E ɰW_ߴl*ox1C!ߟYJKp>NUUU>];:LCje^=đSc8n)NGf(}0uW>gc᥸5Y[-/ГfČhƆJre+@1x]6>_8-0޲>we jX,([+Y(SE:U&#0d2 endstream endobj 198 0 obj << /Length 912 /Filter /FlateDecode >> stream xڭVM6Б"9lڮEI4=(6m3%7h~}䵄hz1ΛἧIMH2"W˫-%"1H&&P&sNPq,h+]1m2U .f1a`c̍U@@f$bӌjPhn+}hҭϮi|l]]-v?PMHφ^ f t@p|jagg\[W'HɉƆQJ _ 8W.bl)6zkCs=>K3A_XM2$` ak/OD6=α]l8hm1(x0#2aRX@qһ_ @`\tjb eJ ]6_]űͿ2(1!By?h³+je/<"~4@yF/PK1j­ IUM@-5lx=5Y$#P[(:9u^޸3~p^=^۲#2FkwCD\_۪&AGD(m:X4XȞ8(Z<%QO;^rtVS% d'zW(,70Mu ?QAd0y4 VeKTg\D ֕օ#;Au0yC:@t>Wm|q}*P ζ= nwKcͥb69G_@2& ܦ08M ]Ni88ɋX'?A$k1Tar#кvqS\;4p'Ņ~"019v0}G2H'YrßN+f?v1# endstream endobj 217 0 obj << /Length1 2809 /Length2 18189 /Length3 0 /Length 19605 /Filter /FlateDecode >> stream xڜwTK%I~-www Npwwntϼ7f>udש]UD2T|zVTtԴ1+}k+;k ]{]WSF*9Cc ] } H#R2ڙZ[/4Եڿ)8t]t:vzf=-ۿ)S}]C .Hhjlb{ '{ezژ$ M -hgokiHm% ;5w" eϥH-1uз364p 77IS}C+;C! /& 0z?C+C{+ z.6M_YhYh&6445EmgDmehOCb!+kKKC+{;8:Z=@ T .FR@Sg:-5--G0py 1FE;[;hTt,,&Z6+ߓ)߁bVFր7p)<?GT߬{ kLR_τѿ󏹿?F%|S=Pk/Y>?g<'A#`a!?BXyOOe)T1{wV|VLM dLMFv+ S+Ck;ӿ.#Ds &Vvv22B LL] P031iC6u4|X4+F7bXh4¿F7bЈF轂o^߈@#g4 ;k轂oSo^OoDGkoq ÿ vCGohahdt4?xo߈齶Ż*о%*05o~:w;7#S?r5m#wy㿞o?]މC?Ë @I,s5-#(o[IMuC9O"oXIRN)0VTb A烘Uɰ-YM{73f:3qYI#<, WCg=Db (,/tӃ_\t3NT߶ Z]J]@!YXן`-X`0J)jf&G(G _5t?a}K \BWr)3.Egk%O}g0vf &kV ScBn؁%[Z95 wqx4.r>=lz;L_D.540 S1Ґ:;^k߯y[!ܺpX^v_oc %B0A u)4VQC=x<ݵRNK=[jxrC*ad4aV!N^& 8T$ݖ0ϿB24v3i2;*.&-͙'"!ߴJ=ՌF!jSq[I yBЁ\%k_9rtg(AKP UaԋD)JA?9,ܙԑ81,06%ȔWxSF4pQi"{}9V@i%=!>$+ɑ/ywn(g-I&IhpM@>^'~3HPVŇF /efQl_\m4 Mb}Lkn|rM#Q~+׮L&KZ[}d>W;0A+q6J9Xr>UVBFRх:|_ "NA'wLu\TmYlIuWV `] >>1}em=ʄ)5/y2`,mSk2J᧷od7gioDzH 3e4q Q+D7'Nu4;ߘ\MB81>E l]C:Mk\hzi!Z6{3sAA-pڿr5}ޥ9T=4y{Ct3Tg`pi +b]W@"m+\NBG֑ x^oGL13xD?Ez䡍51g(e !h27`{!tשV3*X~&u,;S"?1 %Ѳ 6ˡ{Mr}Sk@]Vl'9M'9tK~ GdK9V~c`qBW)?<26*\d,z艰M/Y!ƔtO9gHBhIԷ|Lpc޹'b?QݴD~|);9+㓱=c(p"tOnk4y 3 Leۏ.# Tyɫ]@ni0VufTYXI <Кԧ"21T3F?A+5~\ԓ,{^tyu|uَpao֎H_BvvU6ݫ?&BI)Id~TT $x1&K7mI~1 qAdޢ&`ol(]HL3+4X%,I?O4f' KoaLT8شI'N }LEiHPqScj|e^L}D7d>+ׂ70ˀ TF o&lm[3= slۊrůөr<X-aزXΆ}vxH?t^Zګ2] goƣ:ܵv?Ꞇ0hSOC1>({/ q' q﹵'-T$$< wp H ݕ&!rV4Cɓ<\f5A{oȵh0rQFɁo|8ʶzB#\]+:Sn:qYQ;SY" ++6!xXO<{Ļ$ 41u>fxg3ѽnL-Vu*w1-| SOaXS\TaHpx77uq,LP ڜ@l\EJ]}ӌdF΂ c`J8 ?cWyra_ɧh<^~S8Cy([6 kFZ @ah7&)rE+0WuqzgՄHnvSͽfTA-^h@iPM$u4Цָ辟xp.+lʓנy}{=|_9Gm9`4M6~/HyAK3 ?3&=sL4ӟыľB<2,+BnMW7tY7³_VA&  ʑE)RwqZ'CpYÝj A}ΎU9DNe'v\@66ҦgSlOfoaSo?wuA^9ɂDgR>(L~\"rE,&,a3K#)pw% RC0sV 3Yt1=n7X*0hƞ_7EQs#FeW.%Y`?EɁ`{qew7~tL~dW$EѬtP??lu$]oJ1@ 4@K6΍^JG!bnU}60r&:R$qM"T(26(/z61`KN#Kgը4kQis<)+U%e⹄ C:rlb|;C= ?IHI_ ,왤4V'xmټ,M/|a[.s{%?G1e ȝZ+i׺R$ĈPA )Hm/ӹ1ǫ+]Dgc-.eg-Gn1%a =%t6[x⍑u=<8J``тPceÃLOKv@'j=$d9\=ﴳ5ҏXMhNjSe }OEdA%XW4qcSt -_<0Q,vy;I 4/0{nV-aBqY4r8 X}.t `pN. Tވ A2'"kN9i`dx$[-scAK(vWypzW;`'liQCKpqlEd>XP*bL{ #-NU0Fpu`V$-yJ%'Y٬(:;z_u>?`p{9pyotFP{%&3H͸Ji)xU1 j6 G,}*!o) -gj 560-L Սֵ`w@8 zzSM(X>:055>;}|œ_lG/[/V51/OX;aNj4V=U9mwI;aZ8!}z08,H$]]J8)emƯKlT(.X\BF5f?lf(H*$kNNg"Bb:!(vQqc< FPmC/ oCdn 晦|ʘ_ڻ¼^5g<[h4w)!JJQV> ɇg S"h*pұY9Ba0iM Wǩ5ǐ׮O4E6JPS Tw{>qG~/8vS޼ƯkȋʚLXb}I=2ayL0L4j}n:B"ͪp nu|uSf5Ib`7MPjTTbm$l#q[2kZjujۃ >v:^ !x}lHiN#VT^ YyǕ-J)߇FSgQ2uZ(`=+Dl[ #_j=ՕgrD s_[*v ~QHy1C^ Z:-)J%PDGL"@@?Vpک^nس*;C?yH2l2Y,1Cw38(8>!4 %r7]Q,B;ZJZF&jo99aڣ^TKuT9J>}^ú_MQ#1=7.vwEX l2_(9\ 0t웈?%t珵۾NvGZG^B# > KfQ KtN\VmŌ##؈]u\ØskM-C:!kDK5/Lv$Črŕ[c:KzgT9_c'ƒ`גKk6V`8ȼ''`idNUbqZ0_BA%O&?4zDs ~rix' \ =ةPVN/y4SȒzOYy;)r%fh\̅w׳e1HaWL7FqɱMK^.B[ DAY?y*PG"G#8vՇOrU)ΝDH:6XYw#3CI<>]a}khJٲ>e\S3}s˭v:HTMg7(ӽ,+Eg;_HJ|aa(F|`Gv|WJ9D?I|nUU\z~a~_r%Hs ce-X ZDPu06]XW-C]$kv|xmI_值] MU(Zc׋F`9) Vijw Hyb\X5-Jxu`~DeoBTʍO7d75"(ks햺*P} &uڏ._Y<%2&Pʺ,q@>Sܙeܳޜd)Qb+ 7dJdxyjC'k F"_2 K(#Y8+A{TX!$:_ FY޾-DnIs):nQA.B9M)}LZ_ֻM~6SQ>¿uM1U}(m pp |ZDEeI'6@Mj?Sٟj蒹.*O3LV.Dj`vWT}1]?h/F2eSsw+AS۪UȶAi "c;y _6dd@Tu1f$uLDveE`&|SzGA8FM)Qrχ/X蘹`>\_e07\{U/ǃ;D>}jih;&-hBW:HwHKz;||@{b%E?SQGR`h;X1Pb <8x\c,JgC{|R& ~;y'NlO eKjzZѐ'n_ `QaN6C^QL뵣)6etw D/Hio"yMZUeQxܦiXWv'@d(HL~q[ Nkv[ DP! Qs"}D@(RkvAȃ^O:o<~;S!.*>aw֒,$e+ٯCkWlNnqeʀG`7w&N< ?$Blv>}]+rCsy~16圧v ;Jg! =P6ב7xK",U/тn&mPzd7G( l5f⏁Bx;%#~uNotR#.SN( ~V% O"PUz ULG2+Aymn*Yrf^Rvbh Q~Wi336EzK tn}).huAb9>U(-:6Ӳm6 >K,2"RxTref.zzqb+HYk"[]줊FEn,\O!=mN@ HWR%t 8KJY5sVɆ"G쨱 #ȃ{b6ؗTe޳_0&?6уHרp \GD z>y3ؔF0M95!!cqo]Ij7Ʌ?v^:xJN6KUlAܡ/ fc1ADcѺo ZEbpXhwe`)Jς4Pm92Sącb5#\}.v*@.ofjq)sqIgiNvm:*0If-κöiێr8pXPG]b1(c܆05*I2*T7X4w#'?] @QݹP_Pҝw; T8 dz69s4UU -}GcN_ 'tΦ07-HMnŖD~l%h㆛Z5,H͟t1Cq}bi^ ]> /ADc-T7 k4tׇv~> Gj[L1VvR/Yhj!_xl$У'aEV8cN! Bf0= Il6u1h nq ܜ'Ar0 ښ1OcSƆ*4l".\~㞶&r7߻YU1+Jm)f>H؃^hxP (#ُ)~&Op4^09QՏLKCWsoBt|h$@2,7wBt Ө6TGf|Лng}w+7?(T[<=70$Bae ЖI-n7ǻ |e4  kFX6/,T$ZZꯜ#1^uWLaZ=N C wD JH0Rj/ʩ֊D4z/&d#4:!jxPmuf`}wc6 ,ohط.STlni+[cވ+la40u`bU `hyis \CBOйPZivobCal'4,3nJUm*IEm}6/6 >O:LZ $Pq$I)JhXفau ܲ)mKXD8X ~Qٌ5 ŷ+ύ [rM]st/25 /u̽SUR:TPAX  @.6WZSX㈧H.TR+,o?zY& Fm^!e}(R9v\!m`L A(,v?hc5>eW}41G' i/̔j;H6a]w&k5<*4Ҙd;B@RHfFp L==,dNFNl26[]친JRǛ8m-eB1 m##'ծ16ά} $긐=파)t~ӝj3\ty++8Ρe`Z|+W;nvJ;QKtLK%SH|p[i;X|17KU왔o>0u(g`Rz9UolfgTI4b^ [r%nQ9aHb^I!aS:W#˙>Ց {vXmċIk`U*OҖ/n WD QϓIp7#vթhSA|VER [}55J)i ^9PO_^{ƭ(+8K@{wS+ LYhS'BJ+LN1fUIa!C4Q:C-Z<3nߓ e)iI S lЩF_-sk,:z{kyDk ƢY&}H:C{T+ۡ64{qc,ڼ96_:ciB5To/9OY)Kkw3F!j*iӵxCZN97*=b /\,Jk-.#khWcfF Þ%/j=;DhDk~Fc@WQv˕;S4H)3 S=ݗ].8y_稅CjJVD>׮xasriEalՍN̸LEpH|)y^9VPһrV(%5Q*@|IU>#_h0g@FaX6v!>lH h#uNƚf儥r!ʫ*`T>}lrBZ(tm}u~8C&/gty쎺醊'ܑ;abyѱ!@ljHiC6 A~.C[fO)`OduCg -TfP~$cv?k|KH}( rnc69t ?V$A'[05@ sQ( 9R}eQYx|mJNtMݳrUW9S䇴<'A+X 2jJ0iiӐ爓[rʓ2x-$$XB z6b:쨗^ U3 9r=v#Qŋyv=p;l'_,K)V.Wv{ " ?7ՋHoRzqR(/izv < |ŒەHt9^/`^vЦSp}lI84E ^`T%k,Nd&AkjgbkXyƇo;T'ER/{^&!<8A(@H9-v))n1i{ Mk|KBw H-Ud R`nQ֎OzC0,;] D#YeHѰ[آغ)PBlt6S.ʗYi"ISXA~rOH2r 57z|? e|yv?q>åW99?ThDjYJXkl~jyO!@E`Tīsǹst&6[4{BI8:AC1L>]v.GLۤ@ TA pik8q[GTѷJ#~N,1dל;$l>O%RmY\,= SJ`1 ++Ҹw xaANfSyA<21)7fy/LN7]wA)_D\LNhcʵ2aipRcO)xW-rJnL"-lQF5 >ꪏP6U::FЏUz9W$G?|(zW,?auN=3'^47MfmXB1k#-aԵ󓜯}~j'Cf@^6 d[4j,“2?w [m2'<spEt4g;s|  toulnu,LY Yl~u1h_U7?:B*lػ$&a,tȪǕ'D#W4;#Chan]Ŗik3nja7Z+zǾ*MDjߺi!7<ާ[PjNenh>ūS7-. s'&67ڨj؇sNr  xi |j&"nu`Ok8Bta@t9TtvNkl^*ͿG&`"ncd{}_͎h6v]>ְ܋ZLavJ4u;ݬ9eƙs!y=ZZ۾Ql~Z׊><ikydp01BzS^ss((Vp`6F71>,%Tzsf>3M`}>`e0er!@NEL\&=(Θe$}>uiصqTdD/R[ ,Az# [hyQ =C[aH5 \XuP{u wc?  O|`^E֊{sVp9ьR\9Sc:&n)GV93B-QmwZuz#`"Hd]1FqK밾ƦI!OaR7`50 G+9ڲ (YR2| 1࿾FX)ؤ0#fMwSiϖØ2iGuxjUv FxnXT`?>> 1Cc ۽FUOªGLޙZj`kF'wO/N:9IVM7̾\L8|%n38\mTWMD}X`*cf0tBp3nx9ڙyjw YH<5f;<3a tѝiRsRumS/H0igW_Ms^jPH`iЯibfP5qʿdÔ`H|7{ Z%'3g/nyO `ޞV}7?3 ?K}ope\o!5 81h(J{@M+)tCbVtdpmM׏2P;tglH?y&%2vWD8PU"! N VHnNn"*JqtIF|LC#![fT&*sj~~$?9hؙ z b"˭Ii}5/^k} \YC|5=pvW)Qh^*᭟k]brde߯Gy}j0-X-"2mFhԓ1[7rq Um\J_9gs==!RvNר 6HǒKj'Ya;$@{散wퟲ^lz^0ϊ ?M>d7W[[+&ql'ҋ>֦oq4I[0}tDn mͧc՗:Nʈ0v1`9Bqea ` KѲ Lc~ ⴪52I$?}iB$K.1Ƚ&%IEm崢1Ro=nC*ved)w`iuV!VCs:}z2p)VbYNppG=? ;{֍%VW}T|sr-H́̓Rgg! H0ظ%)6zkֶ~%ޔ[~5҈ TϏM-2|2fb#Q$[iT"6a̽=PSHA0rTr e endstream endobj 219 0 obj << /Length1 1439 /Length2 6322 /Length3 0 /Length 7303 /Filter /FlateDecode >> stream xڍtT]6)!(1H)- 3 1ÐCHIH7R"R k}ߺ׺};"aUCQ|@~A)9P ((/((Dn CBB0\?H(ucSn:8+( IťBH)  POBve脺_' Pt"a`B9Anv\F0 GN']J@LJɏ@:q|`('!BJܠJ'd;<( 1P獋Envijܡx+_` 0+͏E@p/"q\A7ߩjM#a(O~O~9fU8D< CB7'.p8*.`yxA5UpnL9BQQAI!q11; 2vGnʀ7B' @!":~c:?  ן͍ ߿[,`gJJ_OH'$)&Ņ I?5_9{ 3.FP翕n-(*yz(;#5/W8_\0n녺0jkvu(8(]u0O5/CR_v_ C_ ((_̀]nnY7-U`נ @H$ȏ7+Qx3o!ԍ ়@IC WJo+est7"A 셼!~&׿( &B#"Ok~d_7C";~qU-!Oޒͯr+1_wZ[\>6[o#PXHgp`݂KDԧGݷuj1e| &֡/& s'Xo)|I'O>Rf~0p7Am,x6Pa,%#1hҒg,V'ơ(Q="}۰ҀRڮB0u)@]:7:-<h6 b@-UQVB"0aޒ,x\^6Jk䷋GrR|I'bɥ%Sns/oQ*L.xT*Kz&'s} s1 ҪCփ~>ؑ9C{~nf]"ظsճA N"V(Z%/!fj s4O؊٥<A){E ''c{?;)Ck{4+9"vIlt\UB41_dMy'~dp֨7Iq( B[*gqnVJrC ԋBNeql &,dvV#V5u4C#e߽{H\dxǟWltJl 7cv`~COr?NH;oIȺL2>CH577Do>}zg0 qLU麪CíT>1ޗZwY^OZH ^2/ S8dÌIȾ87M%te-) |ĶIT״ٽv<1a̛%`}y.38y'Vݱ֋?\hPMsZrg;R =nvrsMhHߡ[ubc+gׁu?q򡎹jr>Oѱ"]w1v(zywa ]0I<%TiYa{^ih8С5Bجv$ka/0͙'P'g-iϙxgx= Y¦w^Քjs3S' WJO;H1Ɓ$bpc[5W4o^^xC^nDh-$؞;1c-KkŅĐ[BNҫhUǯdN'%vIܭIV΍։!$-^PŎ42vZ8tlJ{}!:B}CPo6P҆xiWK!emX'ɋX 賄gz!U1Qtѣ'20/XfVW_sISм>uo9`}t{y6*3}eEIGG17yl2OLiMVdj1##*tEn"# yOՇʓ׏^wI9ЖtqRB <iySbl8&b3Ilgyb-bT.:8{kMyN{Ƴu&Be#Lw&aߑ6֕K !\hrP4}` ǥxȡ\a%+jۺJu6%T~`fwX1(nM[\ؔ'苺Zˈ8iwS#^j {Trc;O>{,LS64MY&V.W!:Ą։cΈʲwXlS({~%{ĸ-[\;"5715Z}nϻnK̰,nk c OE>T,A q22?bX[%R ~& ieƜ{w7( `%1"e߯zi9(omQ xaL5L[ hm;~~6)ð w`ga¼NIm6W-GQWV3AzK鐚zy]fr>͌y6WXM'K2 (X9&`-|hGIkc/mn1tb}!UQ82jAaO cxNz4u*գˈo{fF@&sRAƟRW,jom):B0ozL!-DY6Ӵ6૦%N6u3o`e -:jtD|d$Mj"E @kj};Qq>!Di9\ ߳!Fb Q%|~e9`E|ܦ˃Q2["{[g_t|:}<ʬ:}̯kΓ/IFTfPX~3b?ʵmh!#W'y$*|̈́43sC"J[[qm8)/F)Vwj| H#҂qF'@ vᑭZⒻg莝G웹zk̏זd)ĝ4$Pukß9-E{_m#:?㰂,I]Mț$H~-/L%[U@Ա0p j(dg1D 5t5)Qبzr?Krg#{DEFj XGm/~x^e)~$SUՃMt@۱k4'd9'583? ː$9}^'<H0YFJPAQ'NuG||Ҕ⚈K[̗[s;楳`RY|ԋ'\Lq<AZ7?#ݺg:g$ Mgw9_4 :{G9Ŏ3LnIn5Vndf>ygPj>Z?&o|KHf([Q+u~o!'ɽUi}XebߙcmZ-킨+Nԫ*%I2Z{|dq&Tr{al-wҺ`+^ۚ 'rnjwHc(q~؀) fx|ElJA G Uf){m~N  9aEs3%j?n,†.<_y-C6G:vǗ#0yQY\ ZFgtXB>9"\ x\itC\~ Ju69o_ LBA/=XŽ=ݫ5Ѷ^Sy~#Ã&hJҍ5pcϕtӤqs+K%O}b0:O;fEڵtf,CUEC4yzL40К5O6}'=AR[7A7 "Qz̧puO&jua4Wީ%.6'*b OͣժKao >VHΤkurKQ0 oԻ$[QbSU!J}^T"ׇ?#ͱVydը}K)/J% 4,8Km;6GcPU,hqGqByBS `,ZBi_` Ľ~Tp: pڂR幺ޛ@S.rqr4pYRˠ4ole0#ͿO;(Xx}" C377 Gr !%uƼidI;E:N}Od;Qg8r+8+'6KF(T}__]m߱uJdFL{oxyO.|f'3,bYboGw9WQgK5Mbtx"$R]֒xO+G #`$ݶy{CZvq; o+\*ш˵"OCK[}#b֦Rҭ0j?d2}´o!++\JrvP 1˙lyYen,,q):?>\ŪhUҼ 3tYu&Wiϰbw|U8؈%PSqD>ޏ8 /]#, + glmC[X*ȑ_Q@GYSj?sk~B[Vp>DB#̖}$ׄB?H%UrJisgb_`̕$al⻓9I$L؍k9Wg;->{0gt-ɸX̵LQh7׆kk8mǃ{G<`Pˀ;caˢVh7lV endstream endobj 221 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 223 0 obj << /Length1 1478 /Length2 6403 /Length3 0 /Length 7390 /Filter /FlateDecode >> stream xڍtT>H( R3tww30 /!ҭ04ҡtҠt|ck}ߚ~sγgVc~E'D GRe]# B&P &0 =8(#!`S0~8@  @bR q)  J@JTP'@ xs(#PW昿nGHRRW8@ :]09 #?Rp˸PR>>>`7OEE 7 0@L` #Q>`$`PGw ƚ:}wo>@J'g"(W0A.g( W@`OG0{0W`!!#~Rs˪p'e$Y  q\>#|6PON^pDS "7AD@0: Loe1 g H#{C($(? @'# q‰C1GB}V@@߿V6y9!0ꯠ!o))!|"@()2q"i ?eG&]- B5PRS, 5/엙1ݠ0?z0]!Vro& E _TB (Gj21@xB>+~Lkˆ-LJ#_&fry*sĄD`$Gi2f' af KA8 `H`LJi bQ#e c? uyy F_/ q$G8J? o WnW)Iv! 4 l?"͸5#cm]SocXˬ`֯E:jҢq8DN։吴Y+ySŪiƊ.VO]&a +c^z<9KBlu<YKlhoDkbϳ}s %wbWϲX'uh+n_. asxLq;kYf2!e߈@X55_6ūAśZxSZXZ(4g{8S ⻡f-ccwc?TpaS}oX~0XxAB2dL&3XHz-mt2cuo>'|kau۷)4$v}9xVϛ%| dD@cL'XdbuAHm/W4Se, }Z֦%W4SJ0Wb Z7y;k3 kDASKSԠߍn2h =}Egg5`a}aN9ﰜSbG$i0dkYm8{^X1x30Ƃ{ȟ޴mv?U=Jwx=+J_I'[*+i^qw_z %ub9Qղٍdj lٺ/{_CIa5C; Y /C/ޝ)C9=`ު!bDCB/N= 5;/.Wnվf~?oeD⵻A+Y&SdbdgRI/vjxr2vR{\$5P/j4V-vΈt~˷dX7>da+l/NWoηJo],kz|2JRZ=LY>kbSoaZ! civX0;iېp㱁xO(l.Rf-޳­ϑjXH3l"8D|(a$kB滔>s][l)?S|e3 }fm=,Ԅf?~VpdkViaN^[<(u| Y~crX1HZ{SĄ'jD ~6#oJ_$dzO7jbԞ=&[8)V][E?v>1 шȡF`~Q%=T4U&ܘa}RL4~T`ǘȯ09v.A>Ae{@ o2z.MXebjE[U_7lIB']7g/JxͲ#R{;9z=bqf:ATf4>|Dz\4(.UpuTQkJR꫐󇒚ߓ3p?_RNPzrG֖v{Z37[- 7v̐1qO)nhEk .]i`by3te:/E^˧c}::n? Vu2S]~~Uh+X[QՎ{I>pb1"-={CwRAncD^/m3AC1=]&==$t7^'=3Ƌai>;hSsSzv4D:%@ź1רصaKLCi߻OXYnopԢ >_d0!C}m7,fVۄ2OqDͷsդoqqQBc+ [54FțHm+LҮ][+d4.68שԸ&L3ck7 #WJ=Ē$R6z'8lM~}ueE>V]ok|iV`,ERuwT-1Mk# ^3rc$ihF& wM{V2q "~,}Q}-A´0̇lυ2ǨԢӃuѮ$2:$bmue@kUA:cUƔ1R!1m» {$BVj&/2g028nMӅ\B5? u+#bZʮY">?74Eax켌i#yG# mY%cQȓw,w.&_Vl; g+|ߜlP%/GR"K- e #9i/4 F?`[]dh0槟3/4^5/SDsut̞ѾS0o-g޶\1T+mRjYt;&Ui9]W '+wb;#{|UqPv_h6.~/V IRwu:4P4lתjs^&\?u?F,RnѕPKJ Hħ>ÑGj؀ϣ}_O*F!|=]/b:t9M9hN64c'˅i^qKGcJnhT [Q5fB<b]iIM3A9]쁱Â5c{,m_^s[D.7[*\xcܒPrDC3_U/q_j;v4?Ī7|<l佷X=p7m0e_}2)wb\;ǦZ+-iChg@fi/snNN0cl'2*_ wtGrc M.FRF83T7.Ney,Ay RpJR9l0Grԥ +Vv4I@opw:-e.ҝgρʥX{օX6&ǝCZUFe> stream xڍxT6"]J5 "{I !@ $@BҫAz" H ҤwD/z  $ jri`E0@أ| 4r+"AABpgǘ!1wz,0z0;o+FZSAJ Xu= Wsdp'tB&cQ0ML!?+R~9?~ a mF @6^uyѼ"|"١HEb_v_zA  u`ˇs 1`4}`/ @ o"̬1+Q Fvd(Lӣ?Nk䗠~9~0<ᇸy@ +L]po?*{c ̿׿ &FB^]y--wD%F>>uRpS7) ڿz6'h1M-ܻpț?A0*Jq@fccl2}&%K䆹P|FΔF~jIJ4{Lw"PhShܹB[ 7UO hvWUS`JꧡJxbS=S,KM`)r g[i#}5_أAG1uiܮczlo$yjYX3ay8ԌkIDI鹙\c a/c.lb,Sa_(aC&sWR@:LNCxVOn6k8D3PM%gl'V=@ḁ,ύ vJIΌ1 R|4!4{&8INJ_rRs&T@'c7vkWou}õJu?"0w)a@$@w6&ŧ~XS>yg=iA|]9,*s"`{v87c^j g8C`-,@ZmM]O ZKZm6~/wSP&c ^d!4P"*q4,4 ro$ZjQXY" ^o+[YdgčN)X/Ld$,~})PPЪP2Z/] ;m4~K Y){اRV3`UhQ`; dTɵ=*玀(^X8BSn{9;{a`H*/.k%qLb^Mq>OkԤTf~9(%~^W)L8©/@%ȗvUH1/$QlbKG&vեܗJɩZ [-x\15.Z_1u'GOɑtRΚ'z(6u=lC^h]^9EYl>>=k0hT)F҆UƏZ7alb͗T Ohbh>8RhT-{Z#5*&xWz(_U%K+I:N2\o zG4r֓T O~`% # U%.LyAyrb1fEph73sE!uh{Ml.RȞ]{qƺK9K0Dr-V܍= +g]{?+䦍I 0O@Ż_?drݴc=|=29l5[ɱ%,5~5-4-ʊgzO {rvn:݀9_*~3 H^8SLAb 4\%ʌmc?/ ˛L~J% q̯O~-') :pdE~+:`5\)^[4[eYnNcۢab׺.y2m֦ 7Yn~xs=Nf{ez'os#;!,~^Ql']]bj+ڞ-R7ࡓQĝYl-- '_r?΃ͼS{[oQZka+W/pihYʠtNS)%GYHXϹIٛ=G ui[uK{sSVB3W?v]B[bFȶ`~.!we"4z-TU(op?I(cIQn}x5{3Io#j&$+|X`V'.%˵l̗&&ocxh)Z&iOgrg=zO*/{P6^wjmB]τVy_s >^o{ѴM'uifR߶`#j?- # a(HY|}q\= 5ANqx(sXA0ϠncYhQ>'}~E2vNކYA ._җiJ;($$̼iɺ!ۺn߃zҒ؛[`KsRp6S@E\nKnQw@e&z[>4^5Ϙt Խz:^L>H~P@Cpk WE \~b⦽dW5ݮï2mY챇c%@INR TcsI5\A]ƍ>'8 g R(3FH5v?,"=[hb:hq闍qQ0jO:& {KT؍̒<*a_[O"bvpy+T!$J8,u8 !}MkD jjW҂'KV:OJ*P'8I=Tl>ĭ&>/Rwy+_Zq{7" ь c/>VL扝?w/,Hm󙸭{sU<ТQ>[S^]PLf%K߫zkt}r>< O(}٧Y>$vn6uO/dL޹BF`Ԥ&Ɗj$>8ߝJ}}AJ.*m+;FD„^79˫[Fpվ h4(rm6 o ˌb+岊cOdaܻb{=hi0qvl9w *Qov]L IW&k:٪˸2ؽo,oOMe4}dgu.nIb}ښq0Jpm>v.@D_`-OVHR:s\W-Gwr^sQp3 4?F=q>'-r?mK]^)~Zm:[NG^Ԧǘ/\j>Pஜrzt`sդ{rJ9vr`NrKr4)),V.m5ṋ\)E45w~PВwFÐ =Ui-8Ugx?sgQpNq4_f5n!j %qC5V+. `5j#< ȶњ `SngUeFOkU][5Gù+&: ┲gP;:,z)g|ɷ9yb`6/KLQm|#P{X`rJZogHx )sijJƴw*ҭ]} xgg3@Ǻ':M8ۑ>&Rbn؈`5~,b'# Ɵ x\H#l_:Axh ? ߮?F/owhΛhO. ~->ЄF~Byn$¨Sx>಺laa$k$3#˵!I?oHZ UĊK'^co-N:|&o^+{'$&BayHi:̝2Jdު\0HMB^}U|R'۩ʟ,fW# }ʽ7*@<8Y1.tZ BhX.,gzy%in jg(@xeue՛+:#dp>d|üE+Uw#r,1l~5 OR?HoWiח8JBV$Gl^=&tgi#]Hb^U[t@M?=MV=sHOHH.iݰE+;eD#`@1)C.TLIHŢsLɥsQAY;i5{ȫ}b2GF%>Kh!I#d3MS$ku2b$|{-c\G;"mGUdGyjgv'•t+)SL\Eqo H&r\Ŝ!Y!YH,p?TJJ/^,Y['-xMK}yֺx6gY 畤)Z׮μ؞iHv2VvУ>n]}WyhNm$F2]BVD-Tq /$|1m3x ՠ}kEO0*%ߩ<ۏ~4Q^դVcvm:3jIx*FNH"G*k3{%a,;ߎ'9qutڂ:a˅p-Գz,JY IsQ8jlj}OIZ{>)Wf韃|ΪȽ)šhBoG;6 J\2|J*iPY~ zN N2< ?w34-f㲑l9OKb̡.';1*߶ѕ+jFhb"uæ!Owle߰MbV;Op&HztF\&Vox}n6Z$BT?7𑷂x+W,A*]>|ca/~TL2cvzrs*n|s~iW=׻z c+m? ~f3,eH5f{O=Vvh;սY\s X`K+C&~r{B Dʐ$ d1;-撯7l#^ўn9hh}4X䋁+OX(5}ɏݸZ=VY MPHkEPr .|8Ak4+4$3 ]23YI_Et}N)flWK 33;Se֟];/D^\&!u6^%e 'h?3o,+n˾e]ڵ&>\ΰޚ5EIVodzW!LƙM&[> stream x}TTS֥HP.E`tA! jHbrCBGaDJ JG4EA@P)JEfZIs>}w\Lqd%ԑ&l͈ 23#q gZBJJT<$ , ` PJuP_SD"5#tנ t8?B('$! 5) 蔿rx* f07L"8|9B @`U O Ntf?gƷQdCw0ATПqS(X9Vx!"$7( C@ ,LE@ QbB*) 4  -L,u?@S@ P1$3D@Haz8Pd8gVNd䂥 S' K $r1%h4WXz0 @x&ρF!bB`^ n@$OD3{M6S"Kڣ#}+# kQ{7.&] 4x]c O,hP0` ~1x('p2.Qϯt%&]2؞ebŘ/Ugs夜_/!&{lN[W8>,bںR2 rT6ID'q^bS MVoC"ii ³<)/׆ a`q>Q+~ ;I;,z'{ѯ]xgNPp.|9+󈽣7R͖;f+@%zRye:pnž vX2+톰@UPCۢH]8԰Z࿌65RjEL~%0Es2~uyϧ H9:2E_ҀOw;.XMjῆoz.{T49>cݚ|nėQeQ?fc9>-x 6{/O=n+`%:u}}9LGAD&}@LKRҸEV"DPQoXzDL.b较rT,NPyWQ NjڹhpjzloaZg^*8!V#>].5pc[mKycba4W-Zrcʩ?۵B姪q'$~ySkS2.i5qcx'z_l&[i : Tx}[X<'̴VU_%uXK} Qꉆ*)a;'cd.U2^6*d(l&Zk3 &Wϥ3z- '^^~ų^B$v+Ʀ=ndsS%)s@*'.$`N1S3mK=@w{~PHŞ&-%1VЋ; 'Bg㦾|';5Mcꝗ;&C]|l{{zxNOM`&FeUk f}(GrV)-5i}&M;ɒ\zw_TFIbXҎ%(u%mnޱVZHEerMUމ~y5c";E=إi`WF劏]SD;+ȞCvJue=>;vrZ9;MQԨʹ>&gp[rܮmARup]sfɂ0y8tXyo[ +z܄zj|ݚνI&׋^LJROt'+K;FblwxYT$guV! BoPͮH/suEI DkPăSW^m҅LM8U_ۙly)Ȫ>13ċ7?/W8J 3ԺDp qmkĢ2]vݚ^!^F\=-LsСOn2mq6VSܴ*c2kyW}'& k4q X.FS _'Rqƃ C䢅 ߲jKYuBCw@¼{2l'r!o%cӄFϕ ;)XM?|2䆇}qT\3Jυ;784޽-ߌS?vuuCᐊŁ-WFfPGwZE?H3vN#61? l\tpI^jdM_ώucA_u|SM㯋AфU~ گfj4Ժ q_~*oݫRqv;;1 n/2ldcF?:˥st:h=h*3`@~‹S ;PIyW ]_ZOq8[/H42JA 3"Joم++Ul-|+zĭOEF ;K6bLM;JIՎzŜQٗ4xeʼGMC3*I Ql:4GS3kܧ[6_r| Q2P{巶*6rW>rT#"h'UҤ/4`mfsk8d%+ ͇?PZbUMEaLӆD9s˕9uLeE(fG41V:U{m{ƕ( -EzD!vxvDGc;37%H-e_䄀C G4BcBӒFj
> stream xuUu\ۺ&V醑nV$&CBJBRiQ@:A%麸g߳ϹoyzyXPQC"P"B el48{o@ {bNN( PأH=7q{EA@ HJFBf +)4‘@ "n($AaP xn*Ϭ@e'152:U ^Pgf!gP 7E;5pWu~ qAeݝ!7)Tᨌ"=3'|Ӕ?@"v"h]ho D7 A%@ i(]4wAHw=  uܼ} @7$8#:B(V!NuQP?H~?Z=PG$w=6QSWgRRBH  JI8FQZB쟊aM(g7x׍ <JzH mk7/jC?tfp(gO?:({pkLP/5i?qS_E$D@n׍ TEP3u?{Oix흠7B ~0$,ĵII"Xѵ78q -AέQP*=G`E W;*Q5ឯRe$F,:9=ҟ<{nxywˎ,8)ԏO,7<,e*7&yiw5`!2vkx /Z$?)+(&&{$Gj:0Zޓi=si~Ў)i>b?8).5y0  1k O?Դ"Pt!47[@}qyT4Q>=Y'_ (h^BaX`2=FV#4m^eJ?kwV,ۭ>nLI!de^lkoÅ/`Pv8ŀF.\kO!&u:YuX`C"ƧmRaGGVL%\;֞oOJp9M 3-*ɳ\"ngXcpg57'NcbO;CcpI Rׯ*>!e拍_E}CQ-f+!C^oH!wMvcB!+2"58Jˋ~jP ["8њAX>t룠a(K*qI*St6ӿA=U\`tdAm/]5N. D|yX@GcMBPCU: K5H1?xyY~qkd"ҏ8%g(cr[ qo_`>"FHty0uo6fl4?>IzW„[ M-ɲ\TxkS, %u! >}L>.`[e5b>* dLe5x#N玊Z_TVha̱l&ŜTť?.@E>~}U:@ jU/i`ɣQ7,K yj8$(15}9^o.k%3O#GB*)А&IS^H*C1 u/c 1Q%H^tV9gْ&/gCg8 ~ծ p{u1wx&啇b]:<sd!:]**i7 xn!gdm6tX%e2hrmij6RR]cCL6 ٗnϻy{Ӑ9WÕeO9%V^׺ΐZh.W$Ĵ Fdb9$| t*+v)*Fәɫ%mDWDO:g)-߬]fۦlY5_T }2(m*#͐?esbk;B=1LI((W-{{%JϦ@5;Zɢ?N‰jY=χܒ\(M4.KE݇Jo'WީE+Ȉ7m]V$% \9e+dvK`"kh "Ngx";Sz CxR ֖WOԭb5k ɔD_L5ZY|E}X;Mo ASa- 1nM [ؿXwGԟ{|8SB,W08̰VU,T4 =QEX.Хz>0#J< S=ue4~OʽM} oIO].!{)p7Iܺ9l"հ-Ij<7Oqos-|ntҬB[p'y]l"=BW kycMj8'GQeg%TYεٱ%F{%2;3yern(9hy r ~>a{m3.0{+k=z**sS"8_)~lYp?Fq).Nܧysfl7C?z1|ӌqm /oxtCn$qx+ED*5..~覢~ؖɢ,)u_QUBwT؁T wyv͞3ҳfQĉ@19L/MKm}/b>~L+sJ Azƾd^ȼU]ؿzeg^sZR5a0+7Sqfk6'Y._m$x͸=Nu^c*wGJ _C#~WK.s/MyX1SB'wE4T׀4B0):և* uni(ɝZ$N«%=4@&q=BJ1]"goxT3 gM5F7 xa Qlh6nI[1"?-. Oغ/f/Z5ߵ\DRLq p6PWpU9t cx 3݇fEZW_s$%O=]zcE@˺ˣ;D3%h&ca?$ ͼ*"H1@G[29)W,|AZm{-Bw$εN2rvS [kGW9[LAp^Nr pVn gk^8ck5<:b`}Z jcFzj3P`-nLqgnKboŊ_9X:c}$M"aR4YTkGbw -\[&[8%߬վ>|fW{k.T->Sj哟 wv5RJ2(]184dY%.w,p +;N~dtu?-$'[CdkL2L- ?h:YMk?MhTvbģ PF}9_=XxɔGǖVݘFQ }yc;jc+RZg3v= [d%fpVD+ * ѿ9wX-(kz*+l0~|͝w5,tH r?9;LꃧZݘd؆mCwߋ2䂫;IW?S_.'P^## :)35)tRBt[5K遽[7D{&?$#mp}T, MDn W 'm +k̩3,m7_V ?eۣ,] ݺ#ř?XG@YKKAKK2|FUstW_ZZGەW1HA0/_h\h?tUbAdUnQpFƩ.< (fkc3,Lutq[*ڰLDzH1ZjǒM`o+C5_$##eCRdzfUJ{XiwX}r0gey׸UJy )!5rV 4m9*L/uU͖6$ǐ\@Vc3Khӭ7O\cZhoSd 0x,O{<6,ݎǖ4`C3'D,MҾ7LDXj+4ir4kP/ W{:D^$#9s C!&jDi:)iGֶR#Ý8{~ a>?1-Sq0-os-G)ܕ~0-%S&L)X`}g5Nqz7FؽB'wrCOxw0^džLA}CKUZ2W"9S\BS̝8c^SDOZꐚwcך/rcRQ汝m B(sàn#pcwWobl:{!ݲ汗·;*;6iCi ULm&퓴[iyGgyZ-tzc}g"~<>E| &;D֑#*cCc_KZ.f$ z,E4I1C|niT/c DBFަ6uo-gou=1Le> stream xڬzcteߗmlb۶]7mۮضYq*~7셹Zs=R(2:I:XyU4mmMDlM9((Ĝ͌V@3^bM3Sbq31++1 %/ Z !6wL+ {bʿnfvfωff@K3bs+[3b1E% RR RffƶJ&Vb9+ 3-VKąؘ `7`3 = V[W;`J.@#oU%q 4Sꯛo 4w!yebFljhk_0GgpuOfΦf..ab3_V@3[sF8ֿ5-*Yn>73 =C󗄱'9oIb7DDyo~)$?FMOW7 X|)Ő(3S@0\M!Z 2V~#8j/((p$'if3ȅb#/I`w4>ݎMԤY>s0p}$ 3Яw=vF9ԈEi>#*]Ձp-`U 4rF̏!iͺgz[׍J̅kqƚM|#ySf;ec~.lc*'Q*b6ќQYU.ӼX9b>Iic;L"_?d  x`~JY:J-b<9J`m' Z#9%1o"8 `A,kB 5>C`2Ba~u"K^iIo)N1Cs mCea=ƬW@\V., @AШn!~~J?PrN:«Xd8!m|F^Fcw]g䑜EY,I&7Uc`*t !p]@V-&&}N`/\hoWB'"L/>%5_ E{{z7G\bwmO.>cKTΕ8 }yĐJEf]' K kŶmVDчmEI39.% ޚR- |O,9_Sz] 8ː7PItQ+O&حDNo\=%HZRpls^~g0\0*:j_MPCN_E',ӒJLE%{gndK^7'GW#lY&ORK9Ī al\֟j5Zo/9*G zAN/XR-wAƱ[C$@ Q̡`Cunu3~]vìUtX-GJ6V::]!ul'啶$+k"z-`>c`eq; WJl+s -::wg[q}m4#!i*b?6U㳋,7>{$jl{ldE\՝Aې ?##zr)승Q- :VE.rGXWM6B>1GُVT2 bgV̧?hm\#;:84Ъ;uʛ|z͏E)w)߹ b S5;QU"yλ:mNR?j1P a8]QtH] w,JF@won!GӃV0 'RoZ5}/j'7Ӏ_Pc6.!Zjk&I53ڗE{GXƠr[KlMHM{5f8n5懒Ioª jJg_2Gu^JB #rafb6ڲi;Ui>s{)6kr ]בqLm))*o+Ҋf;~XCU^H@0ƔP:E-f>RyטJޡg;ĝ,+<6T\ 1f ; LxCVgfj u) ~DDH BZ]m0S{DU@%U@H[찐*?J+mLu4O:# Y.N*:CJqV_vRZKy]#o}#A޵wڬHDR*kaWrx[jhJMm=zX$QL#ep/晊$b|kkp;|I{bzB;AR 5| hp+v-ܞ]%WڿkuŃB*wL)tH܂N[:CѯmJ(!^XM=fi/.[ذ5`1jw=q61(y爎 ׷3;R^QEBJ>#bDz.43rs+`XEOc&z@xJE^-5I+cvklrjb2 ڍ~8_zNVNkq|qs ؗ¸YY=io,r,mHqɁ\噉Q%i0 (i>[(Ǵ; qxnBvUdx8Z╹I`f))-Ά,7ڙB) m8} ;ƽiFu 0$%kR̩};YA;79sfa)/m?CdJB(`2ڞ- VY4On&]";',{>?Ub x .+~Tf䲼EcNĦ|| V)V#%DhT vXe kpEpcKpUB5 hm\oݸCSz[3;M/@8 ^ozuhoQ¦E` ȯ3ٟ>n XB1^LW( Ӭg&z;^!,̇_~.+yJj߰B -G Pp9"zZdlyŞ S|;Z& `;6zKsM8%ֺ\`!47]!hEc;Xtl 9.&C?t jfOSb ԅ|q 5wP[T`z[hY|YXeT4ڞؕ"<~ws,m !=f%`"Z&] (S%, u[NڦkB"mXo-mu|551K /8KF̞B&{O~ ~gSy!Qn晿(ϝ uǻ|OG VI9m4DŽb"W>WaJ`ޚ9tr~*ֻV.$c3Gh΀FFR>gi0s,K#bPlWэXd|bJ6lƖH?Y,,c,g =@.DoEk[fUzAKMD78b`9$ElA̓y0lX:L~sHHD]*Y}f>tHRA G.ZGy[,+/%_'W-nyZͷ-I];j!@  Ѡ^8tm#.f Q' _L|OLdN5Lٌ(j۷hƵ{pn9!3y:nhHPr|Fg  b{6)#/"PuMOCTKiS5RV#\Yq_<{7ޣˌDgDƞ0LA4Qڸ7j}Ǵ lr\%Ń7Up{?2X?px^0"I;&=3 0)^pE1)3RA%f BYyl5 rGfJn~놙eP$-Gd- uG$;ˇՂ,S|ŀnLɼZ q~ЌH WhCch s/.O!O`eW1֢ORrFzދPD)Ol #] ǜ!l;#qs7jX·'-)\ڤW&?FM:ݭm>^nC$uM!zƦh#(?xYҫ3olD> ̞Xr*]ur5b:yr*sn>[XL[UIJ'Y #D쯂Y00c~g W~GoKet(婕 ttMV Y˺8x'; W˽3FB13CR .q9w)ao{jk!u/, 慪bll| hsrNpNJCJ,SP_s#<<>[al7Okv2vI\/_ noUSXX\z]fZlS9 ~m㚍~hl rKP0N H. ԓĭ]:eXB%nfqvLdM^Oi93<;ZCD}$+kӋR}wnGHa@MlQkR S =q` L%ݰY6PĊwli8PcİQkh()fZA nj 3' qIS8kmR?gap9OZL2rv`- E)WZvҺ8.Q/;#aЦy)Rf 5FgO낍7xCԧ٪w~i}S^ά9qFxNRq?i ?\B4j Fdͬ)XgAT_,8h`t6'd*0I$L^qZ!~ZPf"Ԅn<qPg`8|YO"rK<%MEw+jE{ ap-f]t(,fP'mqknkb@'Tá@@:9|!0)펣@̦$WyQԗG=3ckz Cr|? 'Ոvri]L6Mf3 7J 7CwXM?rwU?#3FǿTJkF %fҜ#$c!)ځ)Qb`K Bp=qK;,Tx9:}/\x[|X-XV>47[8k[3x|? f[)&+ 6 hNb|oWqA*bE: DpQO'Har' ^ aGal\?y[9kq-0݇&?l6Cɩ{wq7@l@fuk `%7S$cf([ݰ2vV:j1a׈ƪdH>|Y~>p|@u" eMr[{CB[sZ+] D725|Ssζ{D(ɣcc, @DRPPnq/p:79̤wwP+RvKcs;F)P-%o죶 /@w>ݷzөKB!4K|?)3ϻDlx~ֲMވײe8fēlߐR:zN0&B2wl7fD^+pՍwUwP@ѿ['nP6-v84M"%)ۖS.ѝH2<3q'SBz%Zj> Z\f+,h^ƍ᫢s {"rEA bM9Z(G=8[ܣ3!]㸐Ԩ[i'lm=z9p(qNEr+)-(-",S :F6H/QUr?@5Z=9F\s_ |o[EQ>87l a-ўXTN:tǢ@2f:e |m'k㟳q " U.oO}H? ʓ]##%l|J-㟛0UE(GdUI˴3HTE`}XGuf5~Ƭ2Qd1F4P"_嵄qэ'ȑI^ )#fI0εCu‘j*pͰBKtS/_D"C)$MOE4RW#V"!P)+E{Z*rԴ_Pք}b!>PU [YtW,oƶޫ`"c(#M_jԦ56IK+ؼuGS ; %>ђ>FQ-VzR4󖻋KV=1^O۽Xf% qJ b)!iА⋭FAEt7K"p!tľ?O'2c6'0f#\|U(YV$Je}w2dfmE,TZU3v؝"7:C'4OE&F5 -BnB&V6Z,<mX\d+OZ~]o=#.21eG0M.)2ŵ0203,m`@+X.PZH|@وE|>6BĔ$w})rV}^N[B֙!`\EUWͭaoJ1%y!G6K|;Ya Q>4R2blW7CXhv OI& @.S骍埭L Ƨ&?0jIonk˭ж<jQ@X-Cgs DȓIKGK0-Q?v"s^fթJty P1(\IʾFWj#1S (e\"Z8t1@db=Y&Tq5Fd=|Lfhj OsΘP*㧐Fi\UwLuޥ0[;zKP >+ 34h.󾋂W5IC3K=9»d(g@?DV}u05"$9ZEC䒀Q/@٨RT6m^~V]U:n1=oS|p4"</pӖJũ^;-*Jld-U֌B"џ7.jG}F6!U8^Ɋp=uaGAmFw9:^ϓY bf4Vi&et\tpUǶY ̌PJ?71 $付 c313q`;5bSvyWYKW ņq*ZPv֊ýľq#ht$4u\xTp6cq39Sm>kV! O֓Lb[`ɗDBH>@[jcYW5.`Sx^9vG[>z}.Xy xg#]{F\d7Ӄ`SG Uc05mi ¬λ<,A馉!jƎV+/IGO؝O/w~ZpÊ/KI}f_Jc(!%`z3ʏ FN;)-;F@F+1Mn(&p<8od۽&qX{zV!~E'%xVx~ R !->Mga0W% znwvvF˼A%98ȌdMJ2@ڒ?8F/.=緃4Q0Zq)[T߿Wj^(%||ycv+9szI]VR^</8,2. Sye!EEKemI-|c%Y e [rnNU˘t*ʓ.AF&#Ծ'p n߱LHS_GL ]vO"+L#+[..m CbЀ*a}<%oKasyo%hk6'Laf5uYDKzK*b ƲUewJ"ʙ FKLjŻ}sAST7.2(X:ԣ'ddcr$ZK[E{:N/nm$?I`B2Î4Ufw$ h3q%!ʀwlO2_1{, wȥ1JsG/$yE;e5 g|݆z[ʐݪ  ztISX$ OaC,+V.D| ' =ÂW=K݅<]\.wyuprd)S 1=x7EO< &%)+TɈ׆aQ !ZU½qO#ښ.H5:kF[Ҵe=ɯQ谯C$26Y2ZM%ЩywS(@eN hvA@(؇Pџ> ۾6Ac̄(4O3mY.cIՐ>mҘA$HSzPqlk H-{HbrlAIKob0`|OwIJ_H(Dus4Xwy*W*dx_n;@](ڪۤqTHUfL1uYwCrBSTl`:_6Y~k3S+΁o7x5@GシC)%g=#f?B;-$f4XzކG̬Ie>B*R4.fl;XSn C cR_pojp\o@q\&v+.;f֟, gT \>TUn9 aˠS  %Ӛ75ޏ ;z-fۜP _ /Fu'L@/وSR-F \T'RYBĐCN7Z@WILOkF\_x/RLsԗ =ٸ swazF+e3L ?T2TG2u,bi/X2up4Cg)(2ih~cd|?+/tf"-}v5 L;u؆/Q=ù0^ ^]ѽ95;"ʃB]|P2&Jiz&%{AO2b j0UC6-(l4Nw[i:$d]$N65%cǽ}e(lz}=+#aʞu>Ҙ/i{AANRbGD7YO8 Sv+ =)5#o;LZ1;gJa54ZÐwEN/#q!};u^Lmp6d } zр~7Z$^]&4YXN!|0h<8SXY14CC#%XBxgƒa|ˡg K_?:al:exf8'*:`MqgРSbK$K*N_;FabV{%F6GvY_[$T"sIQ|Z+b.Iw?2mu0Ak.#QjJH_ xWk$2O RliBeC#o-hc-øpestGUa)_d2Xӂ ok8kР(~RLqnVpפD u/G Ո.;K/09<#\NĥUHW4tː4+dXY˘Q` (ef(rvsF0Kz՚}OH,2Z`ޙ I{'Vvۮ~WZ%P+]ewP 909z 2%oV|S{ [BTfPPC,C):.KKcew֧u?˰Rk$xW~؝3^&O\Q[\(AF\\@XB5w/ Ga9xWٜHloJFt)ՕYjo36vDk *0cׁz5Ieu0g5*.ʷoqȁے0\kehY,]>$Bʢ<9|~k۷T\kAx6<"`=E8A?$)3QvBh|ĒO*&|r|C7]=49>O*п'ցeA"' m*62ky}%H,;S >W a.?CD>*U rT)M 7O uхl&:{bW⦛N(HgSZu79i lrDC>=KNEZsSj^*e$y`xjOOB$xl*pGҗYӠ8"1#_Sy ¿ȓ‚Dh7xPQ{D6xW R&ڎ7z#樋x!k#W3gd^P9f RW x@`o2hRV] MMS? X~͋k̄VW&Y6v"x)` Á3yYpA ٵꠊ1@ /0 fǧ3[^T{ZN؇;"j͛,ZŦ1J8IۅPYaRF/꽁y@h豞xg 5 O_&,)'H ׄM<{㤴z.s(B[ZHR6zߏ/N/ɼOY dq u{0ʖ%6dOe~UAA/i%3-|tbU+_s^.MBF%]^=Só:M,ॏLj;RZǜ-Mylǣ> stream xڭWeX AAr`aP1NF@@)N.%$\uxkEϐaUAz WD@A.[H C  w4 <""a)))|郂98oyxvDO  R P#`stuTܪ:U(-BhP8G.`]ZP06 "C@rѷo{`ov{AH%C` ͪX/ ߹Ѱ[ Kܢ  pze@`h 6-# ;K:P(}Ks;?!.>掆 v:@4܊Apj/pM MY?7#7ܿ*..: W ?E}+ swQ4%7߱ng/% VyC!z0w#rۭ?vc8rSP0#GbAP8oG߿]n D??~a !a! QXH_gm; ~h`U7 @n'-?KzCӓLSRj{MfgcadaQ^Np9()jIyI<3W`mGܡgm#z %_Vʻ;Ʒ2FFmϳ3"n9+,iU ̃1 QJEhDwx4Gǰ"nw_lCqlF*'>j!H"9IH0*KR7^W*T=jү\㰗Nlp$-_ćހEuK|X [mi#? "^LYS(6=={J!.<r@4,fzS4yDqȣ\6N"VV'#Y0ȹ:`>æQsڸˎ{P{='x˅G^,|[TOŜ/EA(δ-oA6ZwIL5" #p3=P^5KrTI:T>tsqP"U ϓ*]ռ.*&,E%J=+dDh~ˀL\S<.?"#U e_tG\4xu%k0tyq* 7kl`h쟃(e۟sb@N3 ֘F!lR]ķô_f;wTO!f9eGcXJfZ9OLw'H$Er5{JkN/յ f2RO3/EF"[qO(k7KUdrTHQBS{>[86( ,Yqz{1kBz]DI Ǜ| ౺9^x{+m;Ο馸2OlN{t7Fi j\T}R2Itį#Z7?2ԋidm|:cߌ3q1Uv2]XReFnc(>TU0F6.fqbA;5۰ •{ڞ .=!p+|;|CusG|K^^VWAjJ&HXY!1B^B3b MUXu8t- 1&Ahħ>vQG!J¨DlWAM^r^)c }-iq}߉ IP`?/aU\jk"5>5*ZQmo_%rh92nS|s  JֽLr} WJPrnTUՖ#ϩ\ 0Lj(fr>(v2ʎU4 vq?nɭ'24|^x EGlj=>w^-Tl:fJF@c>dXGz l1D-)'#l7{9ֿt 'e9#¬/$SX7Єx7PiCD_zo"Cz9!-g+]롥ad>+_6:p{H%ZH=68{߈5+ ͨ/HHd:H!-FY``# sro͋qpk!i*me.HRnw}سAJ#&9 /O?߇K1Z^cA {SXIxiOLfȥ;2|˿WGL&E\O{! u罨mgh)NXn1 P1J<o^௔ ukJʳ N ›aiffꫪ^zӣgs9b ?N2~Z?47Y|HyՎPc|G7YzM?)p!L+Yv, #⸪f,\|Ѭ=w1IjOB˄~5@Cy|#VcVo'Е4rd?C}XRa 1ٝUhaT~{m͏ф[[ W-| ,K[:a }ofM}ˌsثu1 KS<Ҝ|_ʺ뻢oS37NWj4k'GKu_;6qx?Pvo^1s鿏QQl(Hs^jo2Tۣ*/!ٓި1P|8JyHSe׹i"&MNG+s rjkĕsJ/z(3>'O|S[ #!\d@RF07TBi3Pw8SƨR&!`P3yt<ӢYJO4jgTmSYϾwGd0|q'=olGv(OrEh2_ ^bTlikyM:5?EHXM^B1V`%2o 9;EY%]ď>jwb+~&ŏu$_|@/-} e<[?E@p:{[Snj9/1ͥLu ^91?/k`WH<o@>z܍gWhcʠY7LNAY[fae L)yg?/=w՚㎥];yHdaf~R-m:&HY*h5+w=߰mn2 J i'a+5ȥ~4 Ps@EiU8&A15fCm O(HjkqC'̼b{|Iz9|Nfd:+pl\n v}NzP?t3-ѠAƋ 8CbK(n(`ء0lHiv}mw ؐm4jKO6Jz-xiQ\]QlxVS z`n8`<٫Hn)r'Oj$;[h;!\ J6r[x-/xLߑsrGx}6/&Dc fSݍS)5 )Zu6 -:=yvH6&7a3eb|wy Lc lMCFnyQIM[1ozAȷYX"7z8]++w+Ξ;Rdj?{hP!&,NNv5uSx^CV' xݤ_ _G~Zu #Y8cHBVJLʊa+Y<8r U2[.k94w%loVT2 bI}8|zYDrė3 77,8xUʶC{p>X 'A1dL8H~`*fXc[,*e4D9e=8b8̾썙|s}` v^}}&I&G5/M G(fLw+3Њ&XWY)+%e'.YrB9h ֳ1MdOba]e"{֡,q_k@Pe)ҿ9Eȯ&{%RAP1\H`E(sa^φvym6J}c\k9Зخvtݽ3#vL\;wŒGBx,=8~P-\T 6-N&$y+Y3A%& J'EZ}rJs˿!靄O@[pĜwԍV&?xǗ/\KX-1?iu~ڪcчUY>A>8i~&?L\Յ-s0<[8B/ckObGo]ղ8AЌ}ċ(~6./InMDL=a'>>CmVl$zȻ@W ˆ_OW7k.. t-~џ3[>0RwOf,sx ecZ^C['{xgD}3cI2Fʱ?l/k*ƪ^~Oh[]ԴslTŹr7//;݇YXӋԼ߇p ({CaxƸ6U$cbs+<(EɢMZ3Р'"SYmZx=̼`Q09)gN<clUNbCg bZAq[0YL1 wca"/S5M2§MBs ߔnT>b$;d-cv<}(. Jj! )K=_x/3,ԅyӪo*|VmΚo.Y(͏$tT։ 5!}>ͣ(I|&µ]mRa Pʋ.P`zlO(^y2X}Sv5gQ﬉F?:3#0c$CcF<5&s-H*.pq=B f*2ӅkFnq-Aaιq1z?b&Yk.T צj,%7 @ 9|^|weʇy@LڨޘγaA-_< \p9aD>CqOWr8Qh9͜0b|  SPAA^Um9˔N=lC/50;^s6xX%|gW}x@o$2nڎ4+_ce~͚pk92K(Zllv`GWg4/p}M৫'b|)16+ ~m8n2ͯnŭ;Y-c8[P IȂCe7M@W ^ Y8_ f(iRdBkooDzM^5DiHj.NOtC^/q=cbbY<$=J-1wdJR辊Q3ZWpќ2 x8])f+0m q4փyɜζtx@gHQ .*w+?^PI$vnMX\ ?B٣ex9FkyhEOvxY4V3 }]J|~&67T]f,ؐzNFBG EU.:om‘.l#9T4~hU4/K<؉iM3ż5` HU~hlr,Prpf5z)(9|\Ti -#NW1^Q 8-&ɟ.Ȍp-/:0Uչ0^[FE8mg]*ז;9{N0.yM[> stream xڬc]%\vSm۶mtٶ.ve˶mu~;wĝ58̽re;+ 9%]x*JƶfVr*vƀfv8rrQg+ 4M,,fnnn8r+/5--Y xN+ {w/FU j [J *Iu$ll Pr32Y]sg,fVK` pqZ4:8\\>\{7u3_ÿFSrpqu1urtͪ$&<]-]b p0i`OI[ٻ\2̬\m l/ 7+{b@pZ;]\;U'FOV.@[s8f9M]涰cgTLa7ssO;Q33I9z̀p STf'DwC3 *{ƚD܈,u5op&KΊ`d (ۯn&Do5j>C^i?Y XCƱcŷ񍞜Qogi?~iGRMc9MH2B߅ PF{"j_h~Ш TJ8X[~nַ=_rI_mP;F/r?|*x-!=׎"Yb;ؔCXʼn7OR. 7 ]j;};WAҕ1g^OndNN*eL1`@˲3P0zf|ϼl)0^ LP2ѢegK+V}AO sC~ Qt,)XUf+raJo& 'gXtw(cmKOgUD0.Zh]$5eůh^z> y9`fwu= / EY%lF^Q!Y HmA}P1 G+=e]|#%^H#xFҌ+,pQp(]U=S.A929%4Z9I2W)*;uvlӜ:v.!`jE?kQk? כv;ߕVW uw36KYi0 E3htO)')'~dWSѣڴo+kӏiB?_M 3Fwy F5Wedc#Va{Ma%rtŞ'a)||h󡦻$HJ % H$9vA(C}RD%<fϤ1/%mG ٩$ְ,^.&%h|4r> W *Hʜ~?:^(~؏?K$@HΞKw i T]xؑd42s>ɰ̿-^Io:%3%װ]P.FβJ ivWzjȡkH9ܓ, ՍX7hc|}6r' vpE8̿-5KH&#eY &.fό,Xɏ:E]E[ق$E&ǃ 8э!TnͩX1 o|KrnJ.Vf~2, g+Cn!xidOP.~V63Jf"kc5T^X6[/bLPY*蝳_ArӸD@svNdM,F;\ca^g%RsV`#4P,w6s>_ݽ|26f짬/y=o©`Ό&h;- (Z蕠}N+1O|4t/!|E'Í^ѐ꺲FZdfn,P)cu7f7|)ZKs8}FR|$se~??z`5Tr*th!u 36aVGAD@=Y-x>iHNIxz-m'6+dU ?VU)X.cUݤras3 rMy&q-`jpOlGkC;) BeEYkQ/)avlaݿӎˁy4kkK=(=ڔ󍒮ÙʺٽRR5ȱ+hIo ߀na"4ZFk;"BJ?,@me9lu1 eEJn϶$=eTw&W6RkRZ%SA91ę(Acg7w{KU~G ]#ͻϥFB ծq$TSFA3H>_y Cv=-'JP'ak?ނVl6 Q#R wg+3>sS-/te\ٓo~J蜎t*$kfv}.aޤzOyڒ/{}L)5dH|C\J%2do,5_Yr9ȁxp:Ip ::J0P'C ` F[Rrl&l1TgYH|r|ȜZ\/.mJE;ZlB<7PoUs:xd̰2l_JM))#]}j"mX:Eճi{KgPg2H|rh ]r_D£hAՙCBF3WѺ9h$PX@X%wGaDm!Q$d7hg!c&.a3>h' پ6AG#7wFѳBsK@d[ޙȋ4ߵ4w*AUs~tu ^9 Ӵrnۥ`x&ʭْ$F9ykŝ@J3tvbFs sڝjOr; 0T )ƳsR2V7ˇ1BmBOl{m.-u?-{YW}}E%Cy>pZy( DJaQhDzr*vx.s|GcSUTѸV5R'lÓ4Ez~C>~ifn&v8b}4FO7#`SbNlo%0<66a" N1:*aPF\6 e ki8#4:+T+v"RK&ub+r4U')& fJ\"R,z)x}MUƕjS*{ hePUc]h,ыvYݵZ !-l}[QΏi3ZX}R1EKUQ ppG/ ƨf':40v'{ IXcjLS)_(A61@;~K:Y+N\@Tu-3mEw+I\KiulpsرuzJ0 V,-™aޘ?yO0ϥlWв~GW36jЍ![늬۳9iK>Kuw 5_PHge#daZ k ?U#!#{!V Yd8U)H IݴO2DMb'w0<;UrR/*VnCEn#cMTw_.{DF4z>=(K쪅͸6{RF]~^Q!U'D7&ar}onBTЬH(b0yyqR@ˬt}5G9Ge(A,DH "zPk]R{W $|I P +,-ٍǠv*ww%gSUq8ޔ;TέPwFSO M/Z^8w|d[+LBXo_(c+zZ\i&w^JlG %By~[(:\0یpl-(Te]ʉ_1PfB<hr׆)fq`[\pʍDwJ/ U赲R6~NPtt՞"T}bB(Ǥnz흹:/λ'rUѨw2I|Q;^{&J9'}<Ȼ<7[`lœ2^DD SMg6Y`1%+9dY8ćѥziGD\Ew6'64t uEGoxrNL-Z,R+љ{ [łbgs7%Я`H6 &:j@a~ЕKm5ťLJ)x:pIn$4 \j2haKè(1? x}pU[#ҮW w7/o'D '[ j]iE/ Jf}vfF4,bրAIim'ϖ};IZ#sCZ|ǿsd'"%֙8)JȒg ]r0(a2\JF1U}ky1@G[ܩ4#wq)XFY7gI^B "J/"1iBݽ f:KS_;4d9DlPQ| HCH*~B^Vjx$:u:ũ"w=URIa;_&3&@6$Xo_Bۀj󵖕`S39e<;E*A rYb'mrMd  CܫjE֞.dmwП?{k7xG0YsZ#;A9h2@ t'EcZ;/--ZstEE.NG@x61-4v#!nywPtIޯw8#i"pe72&Q`\r~.iGAҽnLc ~c%*đs~Rfu/͙Z4ƊNf I[ nhA$+獴voJ=YE483wZ Jo;##q0X8QBWZa 9ۆ UPZiД\}-rMh6^h٘YJe^HkФy!pD.jKF,+(0H<Մ;<,C]Oit;$(Lއ4K9^$lOe_Di塦 ^#iq ̻45X=P^\S _"(^;`MCa[:H~]|5/2><mDVD؆VXX-.^4m͸W H/jEwytOJy[uZpM dlY&Cm4-p I½kݽBZAȓQ=ovW!]Cz*]NUR<^ĉz;cvڇ7oG}ǃ CmC֮>q0G6T|$0DJuN$Ȍ$_߿p8m"4V~sMTg> ~tNn'/Q_ɩ:r*ٳ"뙂%#,n\BPVCҊi-|lTB7Isl̀ 7RqsGu#rٹ&Y)fshoS(sY $=:g,B%%icvJIaG] ?R\\))V}|n0ep7L|AC\F2Vq"O(ڣϨ[a ZL6%npSB ҶbK [M&ߓf%omi mֈHoZ?T?xtnQݶ56qk[<<8@)Uy[XoH,iEcpO XT1yGQV:ccqmZ (uQ󃁋Y' aih0)MDb8,8 } }Ȅ/el4eefn&jN WK[t:X |M(|sW6._p:2u}cXρX8ũj8y\**XNdJ[Su!-b 5SuO7yCX)MY8FA<."/#Mr>#N$h=U<]ޚZ2n$]7-;SՅLwZ?IMtX..qA֌[K1o+ E.%rs#:zA~ǵ1P$_;&VuwQ:~=tW;(i1Qg'8*nRF*KG1W`܉U%BF6=HyV02%+tB2K׈Bj7De`G>7 jZ̞3VKw|TAɻo@/g=ڻ>["P*)jQ4 deA\ݐؐtAf<G% VX 9B)/^: G_,ݰ!7ky.XȽbJ=p)҅?M;eEb̴VAwrȳJ0>4!P`(֙R%Pvl(.ͫ5]!Ų @7\x7N࿫[{G_VC?Ȟ.WߛL'l$.s+OA HvW; $z6b%]:K-_֠ 6q # &Ж|y Egr|,꺌i͟Usad'P$&eHZF5k"Ќ s>zH % C%@kT)dWLX6u+0DUG킠XxdQPa ^/>_GGWwG-\h%Q[xc;vj $7bI|a-R ^d914,ҵ&%ilY1zϽߜm2ʘy-K#գS:6ed@RN|Вׇz3…JbO+.K7neʛ-Lv,@T/24mzҸTʖ1xtYQS&&ç72/b7F<=Pi>}vrZ:X”RROkܕt OsNTK.>cw>ThO65h'KLa u |x}rƉ*v#jʛ_&x[I3 ݧ,0<|R/LqV I #eMavFFC$XOWk5+ vV ( ip/qR,E 4yҍtkrlZ YtzA} ;M}QSDZ~2R  -r܇\e,@Tw|WU !r;Wpy lϾ8tϞI{*AUJAkS,FɭI>SdN೾*9A+8ӛ \͙Gg|nSNgA9L!0Rp4]sKԴe9umato7 s3kgϣPK=P04>#tUZ~I Ivs(>ʥnZ*cT$Me9ثt\IfLO2 /r}ydo5YWqn҇^C;x.eYENѳ9"G~}vÏɥ䥗ǡi]WZ}M{c# KIi蠬m*=U"Rnp'cL@L]Cτu n']]gY_xDr__%SG<6"ҐM|wBلӞ53 YX`:БZҮ0al̪pa,r7€<4#qU0=+8OnkGA,ʎڅEuC_'"!Bs# }KC)Ȣ ~gSd!V&*Oeȹ}0(DaD5o\egT-\`ꟓPv*̩B(phgUBxAY_֯٤O`V3.W1XNw4D{mٴuw`MɠXyTׯl4pX,LŠRvIGSMO{g'G لrH@4$. %ߠcBЂ~ <5y4zh$/ maGo7} W@F־L8~{\LBh[jg<Ζ M&zw ̢jc.)ء"4r4_ Z]vy{jNb{E X؆wcI [,e+KK?[= (^\p/]"~`$Yo5iSiS{WsJ{^":t|ݾ˟E "n@ćBHmF Q vwptc3_d)8b~x"dD ,e$O;_^?>+Wzfm :zʷ ?x0EىllG cF96~Lq뢚ĬǀO@fo*, ,z{R?Qq?Y>jYћpgL;ݼV۶quYC=R潫GAM{G[buEIUHK2q^/[R]{5KhYzv,q)Ex#SU/Ҹ󳊕53.i u; =[AT66Q}ԶG l((KtG] gI5u[qpiR-ϻI#~㻨U{ZERfxn/e݇yHvO.Ł'AWF*|.B?č;N^̌.*oCIqN8 o#D} 9d- K?22㖼J,ۯվ0|%Fi&sר1^8=]?C4י;fkU U &̘jqSzLßXUrHk#*P 'j]S/8G8ߝ ҟ{X\8݆H!WҪTڧqkynef;4ϕk#oS#ݰVk}f 㞷`4\OŴޮ%A[)beϥ8uW ZT+a$!FVI U?Äu^{\?'~ ؂Qþ?bTwsO],MбVǰA㡚ݧyû{#xsWP,B_8Y^Rnl KƊljHM':@+ͭ HՓ#]dcA&v+,PY6az CvOhiGG/ˋ1M6I~An~$ jʟ>v#O5{IZ >zDc jk-%I`r>O%*Ǒ|!h!js ݲ8H\뻩~ٶ)0+W!m7]Y5yݻdn7qB ~w5#6tocZs2D/|{Gm`Id#6d9ј7*lݬ{ң#ӲϳQJE_ѐU]I;&uHBZ_O}/Jl-N;kb?DbڭN6!S4yYձEu+12uב횮{+fpȜ銀2!- ]׻}dNYOo[.vqXwF|:7XmpoȞ e!S.$Gwo(I8"[&ZH('!A?qFc=iPϟK*&N-qEieT{XI-dvb5 >,/G '&<=Iٵ;Jz{3JI#8Q&^zQ,[ =.Fb<<0rc9;ۧksSI+PթЂ|3y;Y8 &\pRSԑ>[ *ZXRQ*gm$5Z+]cgE޾CC`Hz0 ۛN1qyCT>+!4z_Bdֱ&GJt+q"8l7 D4_2i6-U%9x}'pڗ3oh33XҩR *˥D4j;SPg'ytP? _y,EAS,e{tX"7x|h^v>Y7UPvI 8 c~[uǪ۾X#-E-|fToy 7;z"p>Yj,P医38-\soX* uoH.!$ 2w1CV >buer@Jd|Rh5ӹ"RL( yGt򎪱Wn~"V2-SwZv&_il 65ly4H>:J ϊڼiJnhiU"cop(!f˥ҪEw\ܹ2Q~n?>s:w,1ɝG!Mf]S1YڨsWUb(= _9!ޛS 0~`K%VHRj,ǸFFC(CҕjkTN{ҰIѺ΃8 }pC-6)B1OU7[>?Ln)xq;M<#qzKQӠ6nMCnՌ1Xѯf[Jq↉CK*TfKW3$J)1^dr)nfrkM]ۜ^dMBBv6 : /lnʏiLObϏD72ZhS2b`x @x _)Yu@(+ 1>{GBKgi^D0(7Jg;4%|;e*)ty\b@ ɗbLT9zpġL %jɓip9wxV /ҏlqvOz,+ P![&|8:dz+=yG-ݟ;j% .JݎFB)f7cz/6b7*KX0vr[m1 MP$% qOCtWhdPxâY*t54ùdz9~ 2`bڈFMN {V )liBfܾ^Z+ރ6n{S:d[H8Y2y$T3$r~ J,% &\&fL>Rz]&j>2wg)ãZqSAF> W C}g5{ll U*X#H-SB;wpTjM;lM*kY3u(H{@!ץFY 3ט{$]]Nm:4MJЂ/')RijN!;F7Uk?S;S("Lc)㊘N Q$R<1LAe//sOVC-֯e=s.!eJ>%L!2oڙK9("ʾ6~v$?D?X=+[zYdܢCYBo?#?jsPa|b^Mn4}*r7M[M\laTN6 eB]n%_}:4xCb{|jkXzhN1EGg[uI̹59+gݲ,j(/bW[%q PZQ%:V'z,8`Ñ-Bҥ?T?,wfbڮ16x"G&Aջ 0[ iмX>xCV$Vkj7Q̸y+''YIchsoP1bljG_:Uvc}8fe~e1-V#-EڿM`Co  pefXr*C`^S|t GߪӃ׈IL'*֭;,/#v :6 s>L`-e|'M_]$LیA"O?ڿDV3`Z컄JwH&aY3.xGKO#&T vXe5JŹM\:}yGo,K#.Xu}nh' AR8&j8HclO ;!1[i p.-lí.kg#7ꮇށ|IVث=M^-vTC)R%LaWC3-wxtbD _%xHgZ4\t #@сe6>Z~sǁqp h4cGeʹ]ҒIgf:WrO'lܓk_2_Sxl1&ꂀHo`PqCȩ"4HP [^$d3 g%4ᷞFE'GC 8s~8bLbKB~ h[-o c–ʺՈ)cpijeg1#&)ʛKtqOxd׈!ӉkdBg fǝקD|)׹+,ǭl֦a=L6I`+ĔM}>LH5t work8OLd~K9ַ'#|n}N<)lN8!g%?B )w $6Xo|0_Úp(L->C4>~؄:Z+f'uv0SFWLe=x:N-/5jR>8?Yp6/`!kQӏMYqDԕ[~qu,;ld"rRԼ > jM.#%S?-if0Jx7Z xY; (AA}x$VX0֩y͒8X>|ց+Α( (Ecޜ[jSs p@ R5[zv'|ВQw0J/9`r]kp7D=R\U!ΩrM\7)Dc{-k *3}r% {U],XdCq]YJk8bxa5#]!1Z)'[xh=3 8whF%f&77߻7x旫no{=E\.iDC$<;Q"Vl8D[zPɕ\7m-zX+7BN3o/Mt',ʌ𿡰0c`L=m阜hރIc>p6 -tү ̠42^HɶPW^6 ?spQ^$[,dEb=rBcͯfNE9ҞT5jh0G{j֙gvq!Y|e2܏{[*+o)ie*!Q1'"M8zaduD DŅa_m7|#s-k\{#ôa _mz)\r(.h|WRҭeO|x?K!RN}:\#oہ^Q d,~(QT=&%{RK2A*ҭ qUС'MKg"$ 3#j<ygqҘLGA{Q 6O?Δ Q}hk*s]TUö 969t d4g?M\~􁷂BO!y\De+;$,"Ni k h]he ֈs2tj#gΈSWI92@ LSAhy}bAURq6Zo=%\Jh@D"5Lf4lqmA v}(- 3DF. ӧ jS0J"ùA *A̵#eIj(2s!Voȩc,03^mn>uen1<.‚N4/|5s c,IgAceF2ԥ f.+mۯ)̃-z6ci=f1 f"һ5i?v:Mm [olJӰir|ۧH,nzV !3AӄefW?W{6CN?M[2c3._I"E+qNgA&&R7X=Yτ`AH&ScB ,3|W %qp?I,ҽ ۪L,K]yF\dz_e(&k8'+/z7Uynl8&]09Ǵy}VR;N?J0c+m!g6DC֐wPi [P#kCr^yԒ E_Ccan)w`vN['RhEĹQMfB2QGphP&5,XE>`$T>zUFhja0.yރV Sy2N`7Wثdcwly{UZʣ?f+!aDO㺆3_Dp(8DU 2ZATE9S=w6ѥ,(m5(Hi&HY nT(úO%%&`pf*}Won#4kWvɻe;^D9ѸiaҌfC _ø1BB=s5!RLL2y@U@%H|,aE.0VZZe s.UB9n;™u?I~j[('b:G8^R952-?1^O$Sgoyh ,b%DIz=p3dx>)nª1 `lE`MzP+r2jAۙ9PR)8Lǒ&"4Nb+@?1iF(HӶO`F{bn)0JP`>GnpMTox#18z&D"id/2)L^vtXƈ&KrfE$nS PY/H\ImU wy g<ˆ6LI? Z8K}?4K&s\jxLBú)R12{qUmBDJyTqiJ =qAs7ғZ\^`Tl"|ˢ+ij0)%qt Y}fi #sݳiNrXt'o Q}{ۗȞzi.A͚_ ni`UzV95rAtǴ9$C|!9曆9&T}WDWpb\󛻏4CXږybLy G0Tce`HZ)Ӧ}qܨ؈I+44pHc뛿F]rgAf\rťn ?Xpk?<cn5c(k :6qhkfdVvkECN\B(N"Aqf$*7@j_:_^3c!0-(96=s;8~`0F3k_?kι$0srsBMb9K+'?CvC;|ip1tb{!ӌ:ש3 k_)bb?@x@ 5y)~_b`(M8rs/}77i @.x[yPW06{جO71%*Plrw]"ZNWY;E?fE)莶' ((Fs839=!-;":~cvu6 mt BjŦO#MsDfJbY 4'P驀Ap$ G1`~%!Fy׷K>Ofs{V r⦨B}` [_7;NMzOt|K@TpyQ;W12 ReՌW-~ca`L-fLrkcN̠*7/xi!*lZq yP `K*m~6^:ðG1 깍Q@ d#!~kix@'L`0WXr0ŐgN 9a+ԤW 6j}$MInVg^%I R~EXy(J@ "ui}mE6&!> endstream endobj 239 0 obj << /Length1 1620 /Length2 16586 /Length3 0 /Length 17432 /Filter /FlateDecode >> stream xڬcte]-Ul;;m۶d6*6*۶mb۬z;vuw[s1@sȉTM%\x*Jvvf֎rҮvfvXrrQ9@ fn `a0sssÒD֖VԴte`HkKws;G'{s׿ׁW+s9@TQI[ZA@%4w0mB gmjbN p::YӚ _.a1o?ho`;#-U_/)7Ŀt2v'_hퟖ[;\=]eb0vq3/_eX;XWt1/__}/΂oNS׿-`*fܜs7k@TE9:y-`]Pߩ?'#&9SK)ۛ+w @%cmT1t3wf`EL `alwV;jq虙femj ;դTUh{_~JwUr2I4s' @=xl~"b+ Z7qSGvM`S7 :))oMFVkVȔ@3HSiZQA`co@F.wGmC W Xeou>)uE''Q0A)Bf͒ޔA$L'+:Խ  4! "rh|td[!mN< 919qۛ; [NUGt칮7v8DIZwTEe6./YDFIkL*.9Grb? rw \u9|ӈ򵞺!"=1+|d-5h%c;E\lILs]9󟀌jr"E_FUx9!S1d !Eh^t.C0ڳ4ocۇȜ<}+;HO9}r!x 鍠{]\WO$~40k wJ翵9#XIieV#f|$K%ly!ڣZeE('ꂝaz*E8جxO\w4UUS)N.mC5:/f,z ;i݅-~cf4g$ܳv46%sz_,0?8 ,l)۲"8LW8bfkLnybK{ \5C,тʫ^3=Xv5[# o%}V27:SMZL4ct%VT-yG U\N= I"+e=x ٷGJ)DӜ-~XMZ)̩uOǤg\AЌ ="?vX?}b*s!Dy(31}QzZ]R,݋"=\S|2}"r{98*:9^DVQ7cpRcmy2L9g!^;k8o,\>KW8D vLÈ 1Ĝ(3M?砄XpJ˔tlFI<'ieL4-^00A .?j9]5FTtg"Eͅ#ɆX-3\ѓFb*+n 56!˼LS1$0V[tzJ2xkEaV{iup5RG\oe.׸ck;5v6 VNl,VMVI* 54u<XE]I1Р4T]FLTD$ϻek6|{8S#:ת3}ew%gG}@ QzLL_bÝQWKHxX;ûlY&EV\>ݢכD x> F*%Ÿkd-)yJ'a7FfZk$HwRO#5#Ȁi?2q3V͡[,3/,cia^5+o2dXKQiF=ƵAhI . H]:̸DIA4)WFFM9efs oF)^.NH f`i|&/|X2?%4xJeA9;S݂womG*L6ddmCסl6]\"Zo^ O,L!CIif$ȞQ|2BY'bDc>xh61a]G~D͡ o 1)VyILi 3' U&Dn0@DQέH1~LK)y0i e|{cƩ2gRMYDĹٟ(3,i_Q!pؿR|0'Y4*TQ$`8bδa  #"qv&$~іfh8(cbl͏&jx@NRID`UF?̠[6EUzrWHal, uK4 A*ْ5L$ otV<Ė^.;Hx0M]Adwؿ. A4|' 5"vIK.اmgZSP(2[r=X\RzAp5񬴚,8usbXeѨ$w'.=F OK e@*\VdomgG0}ŝ{<0d\THROl7J{uDQgk K|Nj2t +Zn,;dz#-D5O562ƚ gd~,?\TȷаIXWT4^D$GE a\ΒgkG"fNjc~!-R=y4*7$:?b?m욓SFaJJZ* Q|"=w>|@H]Mm6QH t2 R4AW".{ݿ5ZHpES=4V`_V>stHH'ձT)i5]^5wk5w >~Lȉ=IXԖg.<v6 ͪ$)Zz s|) F׊]Seי)|r t4+v@3$A˸{2Bd(&Jf_E.gvw~6%I)9%@-RW6)h&ESGN'yo"e9j2Tb>KwFl5C|NTNxI@KʯXȆB=ikCe[Ն<I "]|f]|ܖ[/^MZȂ<؅RX6g:t&P̹p7GY Ӵٻ8a|3^C,L| Z,1ç7,%!A]\BЈJq~(/GFMi*mÛV#_(bLzi$m,~ C?nH_PSn4bGCD QPQO({i(.pݏ X]] y҅TG/6Gj }Ba$?U:%?yQn{ ؿXt~6`_pNR=!ik:;b̮(EpF&?-!9pL:jy$&ԙ3.dӦ!IvB-5N 1 ֍YBη9H,Ӛ#d*A &㫧aFG+Dtg [;9JZ,`L:?gFP?9 IH1p-/̟nkVQ rNNKMcK$PIq#g{=lxV#ͯk 0Ed6}Ŕ)4F.Ks^(+ HUk=͆Ʉ^L{suN=q1YU,dV*W5;EsVWTU9(P 'gG#8^N- +rKl mz`eљb!cxߘQG N*F p iJFkҜ,wTxYB4XZ &.|k9Fr|Dy/> ܜ` |ݩ2mb'GX~|_|}u=XO>Y :frG$t4dv fSW\5X$shO /qa&&k2[;5:\,*4J ]Cxk+·WbѾ cou\(̶ |)kf7'm#j?[hza$xy#H@F~{57np遳3r|aN};9y܆0AˋDiQ:[-x:cB"Ym.O5=s&=JkҸAT'(I'M)|Ds]3uEOZbzm.1!]Þx#9H!q=gCx}) f,wm>γ$xl $i~yfbwrcUtl6"ЖĚ[o͛}RUG; n&Hܤ媲Y[cƢ.Pیǹ}6~S:"ϧg0;qo2DU(Iۢb1W-.DO 4Ɍ.E;FZХ8tc1^˺ f69ˎKR+vwJ%fl˦/^zЁϏ-21=_g>.kYNd7x.yd WQ)طVsH㰻ʠe QYucob۵v0֞bvC8z>x~Գ INܑ 7B#+ٲ3B 0O`AB"cֿ/5$GBD6!%9A>8m؋.bF3乎O~2G`Ҏ9{)4l`ؘTW{m`cR &}#pkخ]Pb RɩT:ֺK7Yl9fOf<]=|8z"^t[kS~!C_:;ɫ["L ZDXxFpg/]zpu_ mBF݌™]!f 沊|eRSTOzTq {vW1jsklQLk{[4UJEGv?[Sȝl&</'GəPnZޖ/]!п2n޷hx ,\U*gTI[iwdMKl ZNY'Ƞ'1}E֫_q<'E/v}S]6!lVhrc2$D^ Yz!)GzR gL29e2Zh)юZESylTY ]@npԏF߾*!w@ IΒ̠>}]>jO#=̬Y`AJYx%82P$ 6(o*ͱaي4]7eݍawACpw6i+ڿ1JI+I :LfiQ7d5N㠂V$gmGqt4)AˮIJO,u൒*6k.RKAsFf$d3@Pe0X€Ʃ=`!OϺ*$ #6]C7) gRKyp߀/,df>N[Irbt!)ָpoNV^6hx8ׄgZl0sl7GԮh˃x6 8l+UELCSG=k $l)Twر ~ɒjJxrhkA6wg"z4|ޕQn`*L,v&? DhPP<+dy%4F֚ b⎭64W xe`jKyE 2uNۨMQz\[Ev٩@^+Mz/W(ae :qbAvO&i8 AIy,T Ɓ5QRݫْdՁȅ0x!"!W!xtbIkRytmNr*9s3NPnSG+RJ$5{nIt _g T(yqx7qKSW2ۑXO'XH3;*mUC <ħ2:7ZL]cvKeoi&(BVpFcb߉~'!(-l`˵~=>P#ҩoijx^FN[)4A`s*U> {y&1Nzypku" S tWT1X$lHmZC: !es;I@PgC))lN?!ߔ ?S4֟ac@"d!UT_;NIL9X ϑʍFr~pdY ;klYFn]B}Փ0b1ڒHI*N=E/d;MtR _> ?#u"ע6~=aUaҚ0y85 ڷHR9eyrIf%#NJv׋2Vϯ ΏqFNeWT{ o_~,Eh ?`]ˇD !c O>SJ4!ѰA4W"% 30>Z3L.f:D}bޤ*H^醫侔E\\q&cDLjwiێZq=rLh͘4y*GMPIV_pug"' .ڋ-Z5dOm DAp?X~W3(#qM|G6ןy+)3P0?ȇŅjD\DKr`,Bᆿhʥj\bU[&N1~-e0IC;C>MS,Ҧ`1gĵI@[_軂4Ul!?{?˿nڱ`,R3]V>t<&׉y%W&)(ktI:f B qR䩔۫ _#m9C8LPw,zA+&5gcYB$F@^dWri[æOOVK!UmMT<ʷe%|{P3Ҏ#̍(@H}_/GyȢ(W'?itb9X_CɈIԯ0`b9etlD$8kGd%(t]xXNsEsOW*)z"zr8i=t^ _i9;]vJo¢48I>y =lGύdi;ख़L~%|mipTl ,2Z=?pv)Ң6IFY;D핚ktQNBQd'U%bpIqrӬrCNFP6~'o0/E3`qfZA`4R}3w]rӧqAfq@Ԩ71ݯYdx,f^ZDs+*L ;CA PmΙ" 9By08MۣV 1V֔ 'o;= U[ǑI)ĘCwW~Y꬝yGD;a|jfIk~f57HTH)5_>jYZ%w?ZQuJVFiI,| ~{R ٯ^:UഌF6ӸJ#e7iL]ݧ*TO2B< !c\u+c@m_j1i R}7$N = I:D+Dy+lXv{q}33 JM*zPyw=@l] Km> A%9LQDz~?lڹ&x4˭ZFdx 7䵮.ۼ}]1ǯk!,H+.6K[V;?2*+"*BUei62` W~|OEз?2@攪][z}*/45I-KAXGc=,U9pġ+; &\0ڝ<;rHB 8V@)>T yVi ,oO3֙UվQ5 Y {vk~C65ց.hOvDo ̀t;rN>BW\6$ʃܾ{ .)>Ke3iJ^Vo[gP%:cݗ,MKi.%cߘ/ n uqx2Td~`)s/__Y}v);ׇ}amDz̊ xj%/-AϒK&,t+EJiqk D2i3h&?zFpSiP]7McȢ}7?b_iIBxMڇy+vym'~Yݷ'iѾPs^η$$ "'th^E>hyKx~?IRPvAzc,^I} ro |Ru4oSpK|^i1 %#j?D[9v7 ct@(W-,Ϳ'P:x hpKJ р.1jI3\NnQwN)L0beQ|V-g|f|EgƪqL{Q2:[eʀ7GuH=VP!QIAdp<bi!=PlURGR7|vdDB0Dȼ3DCX܋6B Pf9s|92OnH X)!Dq!Jp9q vؗոb$GN\fx@@rc[5MyxA9 > $Ѳة ?)zP{E;ju{*f_ ^Is7Y" XG82=\ΛiԦr9sXՍ1/"TqlJzռD/T7 6Z:w?6RI^| '`;G̋^$CggRH9{A? z>Ҩ[fXPk'Jo0 Ya;U(2#2ݡ},mJ)~Xщ>:vap0:t>/.cږWBJobW<)%S }}eT_^'[5RB2CM!b=Ɇ, H%`]aBL=OȐm|bSjs88 J}0%.@)iJUv[ŕl޹VC^"Z^.yqRا Hʦ6\_OJ)F`iWzˆ?Ft "Iw7t$?,&M2ccAe+$3ٙѴ>+a-^kPr9jx1@5YRĮc=_$t+֧߭JQp?ةXUezP9sLaG/ #u.RuMn'FssF=(P@l")BoċVcVʥm0Y>*)ݴaR'b:pWjlL h ZYCAvxA[/>EmsЗ0jIXF \ؓEcYjDI=}0nŤ{~"NJ\LjhxRc'őԸ*S 4aЇw |uBB E7|` Czv[20mX0%JaN'uMtlzs"wWfJ;c8T D '8nCC \M՝-&Ĝe UoeNm,x"U|`nm ;LI' dO6rm]tN"5) ןt%_HbVX5+,4r+rЮg'\daBw}s^<Ͻe2o!N7EZmt ]] &8gO&Gu&Π r Bl6i9f` i;@L!_dp#AIQTFqv߯\u:IlEHMt+96Bӕ kr.3<;ijhef%ȮvHiw4z}bz2;L(8ck_i`Oa`<梱HuԀp-= '9uN»M V}`&]bv2FK uP'w5yĘS-/g<ꨟI_S-MkW!&$KwA}'$ݍm>@XI|yJS@|ć$m5(_$ מϞibRNq`2 %qWT,Uj t-X0ObCiƝ,/_5wA@ 8?gket>;\^kdPp2-cYF-ZR0*Jq޺b8~Y R.-k)Aާ'V)am`LgJRG$}0OHqiuhLGjzR/\%FsG"sV6RSyz?{lJc\#EG8\lƾ Ɋ7^}v>TڣABw8⦞C;CocZHJxc_jsκck_4]:E ®fA IIHl{;5`}#Lej%6-N(kHĐ;Y,򏟙ߡr17c`^/:Ӗ};rM( fOb|D@[Z91A0jhc7uP =G>~ň:Xb"F{Υr􋍽ӞBqL QT-Z Lʱ#xSيkqt*p &,.fD%'.o^\6Fc'ڔg%R9zpH'.EUbe}vk@G͖nK" -!aK߸jҺN-doF+*sU:ξuU.g8Dwl SH2śn.~laG92W#%+/˿o"ɼ/ަ}DZ eJ4O:~ .\W|].l2% Z>E0RRX ?v,9F;Es,f4Ho֮{Te {BB-NE ۛW5x}F3U7LWZhXO8TGL4;0MYL˳'\"Q5+֧ Ƣ O*.J ؜=^CE}[v?H5:#qǗ ,$ @4.q[M\C2T9#M#5O);<3IDێ??Ak#]Lv*oCd^'N ]o{x<̧9z;SQtʂHh1#p>ޚ]Lmv#i\7ԕYN3ǔ/tXk # ܉=?V;&cJOv8ĶRֻ |8zJm)3,#iUm)aBy _eJ=a͛<4k5 | :qHhGCg G(=Kʬn{F1kdΉnw!Ŕ S8(}TN7AЅ,hӡ#cPwjx5J>@bX X=GGH'2VE憐D6 ·EURN5=,+*)@Zv$1o85\~_aRlC[S';oK+n %+8U+ +@iᐁ+TѯW 8ҭ(VpS 0vbDSU{e߇dWlЁK0#BqXp߅'j|X' @%Vε5v q8֭`&>?>( MpJvgG-%ZLu{sS؝«D8ԐYf95yPZS@BGj,ZڣyJ~Aތۜ8|Gf 3'lCx%hnqoTh:%S0'/59H@ L➲zQiB#ȱ5!gh Q.*ٞsfv>*`M O\HwE'4uJXdR'GSq]P nc k/ ~+)rK. eEaW"U$7y3?DgIG?vL&sI)a|v' m[t*lO=WTx~oG\avN){)ڊq݄0B9nuZmA9iIUxQ6qKdeSq{I=r-uZ5Ixeyڕs-&NepHfNX̧r#8zVQ`\:\ lVl/ 5mQ0]6 tס=¿!TCsLk V>j~7'X un@C9e 5+; ݂h'cޟ{~7n։] IF'kS''=}6:Of1|J, 'WѝޛuXP-"]8AZ@;/?`uq>HwWxwPoLyvTv3pX@=^N~?X]_&U1R O<2< 6w&?bbkߗd*}+һ/ N`& x`j\^zK AMAzlT޾Z i۬+> stream xmMo0 !Rz|UAa۪V&$E 6~=HUAgɯ~uo$ƛLD- t @ZcNt=YNk`T=Ro æeCڕ(>Պ AiZsn[6uc^0Xah\je?0bprOY[AKS|dۙoF)MZ}4W@{YmG;<9`;K (EytbabisbgEjq(po$}Idon-p!J m-O[L endstream endobj 242 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 243 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 245 0 obj << /Length 352 /Filter /FlateDecode >> stream xmn0w?u C%BHiH MU]>RK`[ y.j;ө6\ث0&NCik8J0B pp!Y;p+^E90g趫Dk/¶zK$4Pr ɒRooUI'(?m}Nq n+&-PU4@EU 0?{l0Ƶ{B}Zi_o|gI endstream endobj 246 0 obj << /Length 443 /Filter /FlateDecode >> stream xmRn0+EtA1!$B)>DWwK!d`R83sf8X}\'FoG# (ʎ,V @+48@~j(af&7CGT]ݘ4zP:`=[aj}􇏺?`zW=0Ƭce6COI geLb S0Y-; L>\Z4~0FQL?aPe$˨ VWΎ*JR)HXF.#ʛ0C~ !)"I-札?9#.<^[0$gı#?I> stream x[Ysض~ϯcwQўSSB4t8P<(0=~%ْcsyIR OVPWHGmhnquWXq :'0{ TQJ#4VQ':dSCaDXA tZ-Vpz3ԃ#%VGV``"++~RZ%R c-ɞc2,CHRBv^ ep6QcpcAC`]+IcB5'Z *ўEbMЉ;CxR "J&k ;kptXI@#4 ,sAN$ %$0)`{^A;VB{s,)ct,$Lb12q<$B$(6E7QOp`q$׉3Yr v$ukH+E[H ƒE⭦xR @\︁.8 aw$!JP[W46 &\r /'l(!:p" c"\;w$X)Cxؗd(F`-C7FBd%!_`2ه@;$Oh4.wyϋ?^ӷv߱;@CzyLJRCaiʆTq{ ;Iس8aO_E5?w>q-p<'CFC"0T+O I_MoqT>8dp@.0$DJ:!{X/4$Ù/*lҤ^jRʥ\NRXނ(ߧ gzEHD.:__Obr{8:@^oB~dWLyo&yiTJ.kN"#lxN\dlNw'X?O~?mB@|H] pm\oGhS:AqD ^^Aĕ`nXZ b6lZwÓ fʧV-|8>8=/-nI!%ip U8Wj`Wv<Or(1aOv.w] gW;q!Nڟo|"($"Yp8b.RBQؚaWQ&jn=r AQxΧp(F7eeS݃•BwwLa`i@ºuEea}"\ƨwŨ1T}j-궭 ka#}[Xѡf76^<>{_UT8~sЛf#WNxĶjljʟ>=$"+uWϫk֦: aR.<'h~-⊿7p9W\; 9=^,eyPIe=Mu񱽍o㢇yFQ'ijQ٫T8;;p RW۳,ϰ􊳨W_|R}ZZz||FY$|%U-Q,t%J q;hLEi*Γs[5ږ_QYks##BCVE iׄS6FT-$A/έWpT?Ǚoo]0*kf$}g&VSib7gmb\i"Ct=v>2͕ahh]%Ncd|LMR@8IjѾ͵ $/mUBUMҌiz&i.͉G(,jFyrA|Iϫ>5!i{MMMErbI7d#j$5hBVŠT'+M ' +lSx{RsM1}WU>"Av-xM_JF½*MX7L%>Ec9*ڠm&#eb>5 ߊa1߭yi=` plyzvsnHmtGc~?"uhqBjZQq͏T.mGVP!xͽc}}S9`^Px(@|֟r< ?!~99٣Q<Y}-n/d4p]]د Gp>٠5~d꺤oP5o5lPFW<'e>|Qz6K\gS}a{=aO!{Ǝsz석;cf(E2윝O~>/nJky9}Cǃ0c,g]sv9+v53lîu>bg6g36d#6*F9 鬸1c&5n節'm|&>܌|lfѬflvJV^O󜕟݌.S:xL؅E@ߠr0hrڵ@DŨ̯࢘Mٗ ϋ09lW:veUL; ]Ww5BV/)ϓ޿Wo[(j(ߝ2mXZ#m:Ppz-C,-qMdkd4|b; AqYٰ-3jaG񋬼@lz?\f\5,u&Lc^|ɋ>FcbװcYxQp(FŨ(t'oQ of'yk&= S6k9j şjU=aOv\ ^cIbR'}Imzu E1~-1+^j8I\GL֮ IJƄ$tZ'"VMRA||ݻq _B~ux$H N- RvIYnK\@R\(n^{e7fkr3Qo'/uF=a-ܿu&01fb|U>oyZ: kGBX[Rfz w2Qb:]5j٨*Uw1L>ShưF5qboPB[鶫ٳ5zLyc_ڕE1eEwo%Kk*h̬Ii!RtqEJy\EhDTЍ0lSe$rI0vYu%vE03Ơ*"_[ݻ|[THWۼXoUVu]QD#.D8Ŏg+wĝxΒ ڙ;"C'y" .:Xn}Q㿻2Z/Dl؎?e:,L:0YWqQ^ǡ#6$4"h\&H.dy +q y2=zݦ\@6=j{zke2AmzL[a6=z{zWR-h1'зnh[I)$i Mܦ64/bDJ endstream endobj 247 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9햅ļ{3񸟤e&Oo]&C]]Mq>zwt߉Ǯ)n.pCx?nڽVgx=itO"i [\l\WM}'ԭ̚t4pXeȉeU oq yM\-CnCW_Ey}wP dZz891euB)] W-\v\]~[S!8&+Zce"'2Ɍ5I@|"B2AQhSlLء28a}ɑFq5ҍnnbfǮCG= Wܢe$g;A,:sx l=NOTƘ$0_س/vЧQ%~Zx pX2]$^qnaK??q FqMyc0=) &l(mi,3|d &\c ]͹&ӈ9w{d-tx\ \cΜekqLJs?<@>qhx .׷8wl~1V<*m"mmDa endstream endobj 249 0 obj << /Length 663 /Filter /FlateDecode >> stream xmTMo0WxvB+8l[jWHL7RI;onDo3ތ?n~<&Y$ŝK_IsE77E[^N\5sߖ;7|[lzmS_*7F?h3ONL7u]~l+l+w͛R.bYFr8)9>*QKr7P:MȡQ^s$LD6aȑ*s.$S56`>ƄmÁ#TL 5kd}WXssc*{Rh/#? bE$L|ږ8^y>eSQc̯bV̯cNa'_OAJ195kd3EH@8ܰ%~As*=F 0`{RLPh33Y$LƹǬ oqMsȼ tx\ \cΜ-eksL ?"@>qhx ׷=l~1֍>*]!Ma@ endstream endobj 250 0 obj << /Length 664 /Filter /FlateDecode >> stream xmTn0+Jb;!B Hv[jWHL7RI7vJwD/3ތ|{M=I|/ųK_I}E77E[^N9prvxO}[Yb; 6ۥrcVn!/פ'|o B\ ?]?m ԽuS ևht4t"EUgy y>ihgz9wvMu*n]h`Ah;R5K__;'4S}}ꢅKlkީr8)9*QK"&VZ 5ID b!"U\H(jm} ۄ @*&"C,jdkknn"cW}O= W¢mu|]CXz :3xl=΀WOTƘ$U ۊu':S9xT>&^s 1eΘOd~`xՌk?s׾G0N-۰o|e>ha>6h Z8sseY1:@++܊psqKoZ׺q=7cM endstream endobj 251 0 obj << /Length 663 /Filter /FlateDecode >> stream xmTMo0WxvB+8l[+ML7RI;onDo3ތ?n~<&YվI|/ŋ;t硋nn\3<:Wj\=?-wn6pGۦ|Tnʽgxt{o $Nߗj s6BK)ɱn=A9n1 9Ң!X-O4$>΃;mc-bB`ew\_7o Y KQ#^''ߛ.?:'4ʫ)ʝCC梅Klkok*ؔb%9v r(CXYh&(9O&"f0H9)Dhbc6a@*&GY52־+vĎ]=\ ~ҟ"t&g>mK z> stream xmTn0C6U@"mTt@;olvR3ތm~<&YվI|+œs_IsEWWE[9;Wj|;܉Ǿ-w$mm o\1A+Z7g{uo}m $|{'Bp/u u+$bTy{!y1 GҢSX< {NmmXN;{}y[Dδt d\{?:1 kmn_~߼h!R,6ew*ؔb%k e+Kӄ$a"1x*s.$S56P>Ƅm„A Fs 5577vرϾ+uaя6R:!,əCxg+ѧy*JcL|*m:fvuiWUꧏɩ\g%<Ϛ"sÖ0_:3x0kjhyIYx0aCnOg3$cx0<<v5O#ܵu7A 6*sZ ZcΜ-ܠeYksL ?"@>qh|tngk;dGGMc endstream endobj 253 0 obj << /Length 799 /Filter /FlateDecode >> stream xuUn@+HɁkc{!5&Q^ үル!zya/W7/~jyld}{9}N=C'u\W;oέO*k`~?''3Ɖt3\;WS]Q?SVk ]{9FSѤoG^ 32j$WC0h޼O~wC4Sy<&>U]Rn·ÛB~,{_=ڰfhm_}4zu|sH]Wb MLD!E!B FAC\dQQ(%T<#h^QqKƊL0cF F͌a._Q mPG9'+X38)+ι7\'~5:r%%Β뤧$1$܋a %aN*Atg&W̡`92/X[B|fAlI)dKdgI$[d$[H$[hv-|9~ddK%[w-t--d ~)BO)Rd dK|ɖNK)K)++Ζ]Rd]Oz͜|x8?<ᤥNO]?p@}_:h? endstream endobj 270 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000V\000i\000n\000c\000e\000n\000t\000\040\000G\000o\000u\000l\000e\000t)/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20221028015802-04'00') /ModDate (D:20221028015802-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) kpathsea version 6.3.4) >> endobj 248 0 obj << /Type /ObjStm /N 33 /First 272 /Length 1238 /Filter /FlateDecode >> stream xڕio8WcAjUF4dQ\ae˕l~PG#n^μ|8"'rHF BA(%Q0I P*)a0N1T\ʹ$x ӄ @5a4aI"$ 0 ԃ< oTL`<[0CEd)Φ$f%:+pELiC|0ۆdxlp%t0<2Y#durv~2ZLj7y'aLmA5<2=JIPĔyut̠@=,hXLL(%] \ 7qo=Ȫ.2N zhD&kӃ۸̡e;~~j|6mWxhEew%c$qMEs`V~;̪̻WffqB02iaW韣'$(vŷw?C;T)>IhYHVUQE:IM^n46(RyIe j *קڇC+jgTݴ]Z+-eSי[fS֘Ը.17^uI<&ߒ7$$ycU uk s A\sHx ':[3Wa?tV^l2PA;A.sKmj*Ԭ=t X*綣 (U=<'I]@k3B;ta4zv{g(6z?Y393ѷew)GHfL n}e0WY|5˿ ~mjk;[ꇢ:̑=.Q$r1ᯝɣd^VB%}hFwQ8 :*tT] Kk eÕΡkrT\㢕c Z;׀X Gc)}Gwɪ~<5\,\,ExS5lQ u:l6)z4"5a-ڙֈ D+V Vt=+~uۡ;4/ +;Sٻ <9F66D8E8FADC0335CE6B35055F8630BA>] /Length 662 /Filter /FlateDecode >> stream x%IkTAF8ǎQ㐘611QcM4lZ [!(ADPp-]d+{vZ9ܮvU}U!!`fz*0VZjqvPijFpTf06-`k?`v1xSM. _Ny%6`6 ηV{KM@<!ό=ٴz@8Epnn0G=Fg?SαXsK,8yPg,4Ep \f  nA0`Q0~V bW0 <Ǫ*A˗ɸH %zF1 c "Py<-b s9rJpr']BS?t$E, 6+O'‰L6E"Yha7aI pW|5a[¸%xaD|&xJ/EXTҳǝ+ko2^|X]xj4u?] $DJ(<2n~! H0`"ı'bL~oeb͗ endstream endobj startxref 168828 %%EOF expint/inst/doc/expint.Rnw0000644000176200001440000004113214326667517015324 0ustar liggesusers\documentclass[x11names,english]{article} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage[round]{natbib} \usepackage{babel} \usepackage{microtype} \usepackage[scaled=0.92]{helvet} \usepackage[sc]{mathpazo} \usepackage[noae,inconsolata]{Sweave} \usepackage{framed} %\VignetteIndexEntry{expint user manual} %\VignettePackage{expint} %\SweaveUTF8 \title{\pkg{expint}: Exponential integral and incomplete gamma function} \author{Vincent Goulet \\ Université Laval} \date{} %% Colors \usepackage{xcolor} \definecolor{link}{rgb}{0,0.4,0.6} % internal links \definecolor{url}{rgb}{0.6,0,0} % external links \definecolor{citation}{rgb}{0,0.5,0} % citations \definecolor{codebg}{named}{LightYellow1} % R code background %% Hyperlinks \usepackage{hyperref} \hypersetup{% pdfauthor={Vincent Goulet}, colorlinks = {true}, linktocpage = {true}, urlcolor = {url}, linkcolor = {link}, citecolor = {citation}, pdfpagemode = {UseOutlines}, pdfstartview = {Fit}, bookmarksopen = {true}, bookmarksnumbered = {true}, bookmarksdepth = {subsubsection}} %% Sweave Sinput and Soutput environments reinitialized to remove %% default configuration. Space between input and output blocks also %% reduced. \DefineVerbatimEnvironment{Sinput}{Verbatim}{} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \fvset{listparameters={\setlength{\topsep}{0pt}}} %% Environment Schunk redefined as an hybrid of environments %% snugshade* and leftbar of framed.sty. \makeatletter \renewenvironment{Schunk}{% \setlength{\topsep}{1pt} \def\FrameCommand##1{\hskip\@totalleftmargin \vrule width 2pt\colorbox{codebg}{\hspace{3pt}##1}% % There is no \@totalrightmargin, so: \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize \advance\labelsep\fboxsep \@setminipage}% }{\par\unskip\@minipagefalse\endMakeFramed} \makeatother %% Additional commands similar to those of RJournal.sty. \newcommand{\pkg}[1]{\textbf{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\samp}[1]{{`\normalfont\texttt{#1}'}} \newcommand{\file}[1]{{`\normalfont\textsf{#1}'}} \newcommand{\Ei}{\operatorname{Ei}} \bibliographystyle{plainnat} <>= library(expint) options(width = 60) @ \begin{document} \maketitle \section{Introduction} \label{sec:introduction} The exponential integral \begin{equation*} E_1(x) = \int_x^\infty \frac{e^{-t}}{t}\, dt, \quad x \in \mathbb{R} \end{equation*} and the incomplete gamma function \begin{equation*} \Gamma(a, x) = \int_x^\infty t^{a-1} e^{-t}\, dt, \quad x > 0, \quad a \in \mathbb{R} \end{equation*} are two closely related functions that arise in various fields of mathematics. \pkg{expint} is a small package that intends to fill a gap in R's support for mathematical functions by providing facilities to compute the exponential integral and the incomplete gamma function. Furthermore, and perhaps most conveniently for R package developers, the package also gives easy access to the underlying C workhorses through an API. The C routines are derived from the GNU Scientific Library \citep[GSL;][]{GSL}. Package \pkg{expint} started its life in version~2.0-0 of package \pkg{actuar} \citep{actuar} where we extended the range of admissible values in the computation of limited expected value functions. This required an incomplete gamma function that accepts negative values of argument $a$, as explained at the beginning of Appendix~A of \citet{LossModels4e}. \section{Exponential integral} \label{sec:expint} \citet[Section~5.1]{Abramowitz:1972} first define the exponential integral as \begin{equation} \label{eq:E1} E_1(x) = \int_x^\infty \frac{e^{-t}}{t}\, dt. \end{equation} An alternative definition (to be understood in terms of the Cauchy principal value due to the singularity of the integrand at zero) is \begin{equation*} \Ei(x) = - \int_{-x}^\infty \frac{e^{-t}}{t}\, dt = \int_{-\infty}^x \frac{e^t}{t}\, dt, \quad x > 0. \end{equation*} The above two definitions are related as follows: \begin{equation} \label{eq:Ei_vs_E1} E_1(-x) = - \Ei(x), \quad x > 0. \end{equation} The exponential integral can also generalized to \begin{equation*} E_n(x) = \int_1^\infty \frac{e^{-xt}}{t^n}\, dt, \quad n = 0, 1, 2, \dots, \quad x > 0, \end{equation*} where $n$ is then the \emph{order} of the integral. The latter expression is closely related to the incomplete gamma function (\autoref{sec:gammainc}) as follows: \begin{equation} \label{eq:En_vs_gammainc} E_n(x) = x^{n - 1} \Gamma(1 - n, x). \end{equation} One should note that the first argument of function $\Gamma$ is negative for $n > 1$. The following recurrence relation holds between exponential integrals of successive orders: \begin{equation} \label{eq:En:recurrence} E_{n+1}(x) = \frac{1}{n} [e^{-x} - x E_n(x)]. \end{equation} Finally, $E_n(x)$ has the following asymptotic expansion: \begin{equation} \label{eq:En:asymptotic} E_n(x) \asymp \frac{e^{-x}}{x} \left( 1 - \frac{n}{x} + \frac{n(n+1)}{x^2} - \frac{n(n+1)(n+2)}{x^3} + \dots \right). \end{equation} \section{Incomplete gamma function} \label{sec:gammainc} From a probability theory perspective, the incomplete gamma function is usually defined as \begin{equation*} P(a, x) = \frac{1}{\Gamma(a)} \int_0^x t^{a - 1} e^{-t}\, dt, \quad x > 0, \quad a > 0. \end{equation*} Function \code{pgamma} already implements this function in R (just note the differing order of the arguments). Now, the definition of the incomplete gamma function of interest for this package is rather the following \citep[Section~6.5]{Abramowitz:1972}: \begin{equation} \label{eq:gammainc} \Gamma(a, x) = \int_x^\infty t^{a-1} e^{-t}\, dt, \quad x > 0, \quad a \in \mathbb{R}. \end{equation} Note that $a$ can be negative with this definition. Of course, for $a > 0$ one has \begin{equation} \label{eq:gammainc_vs_pgamma} \Gamma(a, x) = \Gamma(a) [1 - P(a, x)]. \end{equation} Integration by parts of the integral in \eqref{eq:gammainc} yields the relation \begin{equation*} \Gamma(a, x) = -\frac{x^a e^{-x}}{a} + \frac{1}{a} \Gamma(a + 1, x). \end{equation*} When $a < 0$, this relation can be used repeatedly $k$ times until $a + k$ is a positive number. The right hand side can then be evaluated with \eqref{eq:gammainc_vs_pgamma}. If $a = 0, -1, -2, \dots$, this calculation requires the value of \begin{equation*} G(0, x) = \int_x^\infty \frac{e^{-t}}{t}\, dt = E_1(x), \end{equation*} the exponential integral defined in \eqref{eq:E1}. \section{R interfaces} \label{sec:interfaces} Package \pkg{expint} provides one main and four auxiliary R functions to compute the exponential integral, and one function to compute the incomplete gamma function. Their signatures are the following: \begin{Schunk} \begin{Sinput} expint(x, order = 1L, scale = FALSE) expint_E1(x, scale = FALSE) expint_E2(x, scale = FALSE) expint_En(x, order, scale = FALSE) expint_Ei(x, scale = FALSE) gammainc(a, x) \end{Sinput} \end{Schunk} Let us first go over function \code{gammainc} since there is less to discuss. The function takes in argument two vectors or real numbers (non-negative for argument \code{x}) and returns the value of $\Gamma(a, x)$. The function is vectorized in arguments \code{a} and \code{x}, so it works similar to, say, \code{pgamma}. We now turn to the \code{expint} family of functions. Function \code{expint} is a unified interface to compute exponential integrals $E_n(x)$ of any (non-negative) order, with default the most common case $E_1(x)$. The function is vectorized in arguments \code{x} and \code{order}. In other words, one can compute the exponential integral of a different order for each value of $x$. <>= expint(c(1.275, 10, 12.3), order = 1:3) @ Argument \code{order} should be a vector of integers. Non-integer values are silently coerced to integers using truncation towards zero. When argument \code{scale} is \code{TRUE}, the result is scaled by $e^{x}$. Functions \code{expint\_E1}, \code{expint\_E2} and \code{expint\_En} are simpler, slightly faster ways to directly compute exponential integrals $E_1(x)$, $E_2(x)$ and $E_n(x)$, the latter for a \emph{single} order $n$ (the first value of \code{order} if \code{order} is a vector). <>= expint_E1(1.275) expint_E2(10) expint_En(12.3, order = 3L) @ Finally, function \code{expint\_Ei} is provided as a convenience to compute $\Ei(x)$ using \eqref{eq:Ei_vs_E1}. <>= expint_Ei(5) -expint_E1(-5) # same @ \section{Accessing the C routines} \label{sec:api} The actual workhorses behind the R functions of \autoref{sec:interfaces} are C routines with the following prototypes: \begin{Schunk} \begin{Sinput} double expint_E1(double x, int scale); double expint_E2(double x, int scale); double expint_En(double x, int order, int scale); double gamma_inc(double a, double x); \end{Sinput} \end{Schunk} Package \pkg{expint} makes these routines available to other packages through declarations in the header file \file{include/expintAPI.h} in the package installation directory. The developer of some package \pkg{pkg} who wants to use a routine --- say \code{expint\_E1} --- in her code should proceed as follows. \begin{enumerate} \item Add package \pkg{expint} to the \code{Imports} and \code{LinkingTo} directives of the \file{DESCRIPTION} file of \pkg{pkg}; \item Add an entry \samp{import(expint)} in the \file{NAMESPACE} file of \pkg{pkg}; \item Define the routine with a call to \code{R\_GetCCallable} in the initialization routine \code{R\_init\_pkg} of \pkg{pkg} \citep[Section~5.4]{WRE}. For the current example, the file \file{src/init.c} of \pkg{pkg} would contain the following code: \begin{Schunk} \begin{Sinput} void R_init_pkg(DllInfo *dll) { R_registerRoutines( /* native routine registration */ ); pkg_expint_E1 = (double(*)(double,int,int)) R_GetCCallable("expint", "expint_E1"); } \end{Sinput} \end{Schunk} \item Define a native routine interface that will call \code{expint\_E1}, say \code{pkg\_expint\_E1} to avoid any name clash, in \file{src/init.c} as follows: \begin{Schunk} \begin{Sinput} double(*pkg_expint_E1)(double,int); \end{Sinput} \end{Schunk} \item Declare the routine in a header file of \pkg{pkg} with the keyword \code{extern} to expose the interface to all routines of the package. In our example, file \file{src/pkg.h} would contain: \begin{Schunk} \begin{Sinput} extern double(*pkg_expint_E1)(double,int); \end{Sinput} \end{Schunk} \item Include the package header file \file{pkg.h} in any C file making use of routine \code{pkg\_expint\_E1}. \end{enumerate} To help developers get started, \pkg{expint} ships with a complete test package implementing the above; see the \file{example\_API} sub-directory in the installation directory. This test package uses the \code{.External} R to C interface and, as a bonus, shows how to vectorize an R function on the C side (the code for this being mostly derived from base R). There are various ways to define a package API. The approach described above was derived from package \pkg{zoo} \citep{zoo}. Package \pkg{xts} \citep{xts} --- and probably a few others on CRAN --- draws from \pkg{Matrix} \citep{Matrix} to propose a somewhat simpler approach where the API exposes routines that can be used directly in a package. However, the provided header file can be included only once in a package, otherwise one gets \samp{duplicate symbols} errors at link time. This constraint does no show in the example provided with \pkg{xts} or in packages \pkg{RcppXts} \citep{RcppXts} and \pkg{TTR} \citep{TTR} that link to it (the only two at the time of writing). A way around the issue is to define a native routine calling the routines exposed in the API. In this scenario, tests we conducted proved the approach we retained to be up to 10\% faster most of the time. \section{Implementation details} \label{sec:implementation} As already stated, the C routines mentioned in \autoref{sec:api} are derived from code in the GNU Scientific Library \citep{GSL}. For exponential integrals, the main routine \code{expint\_E1} computes $E_1(x)$ using Chebyshev expansions \citep[chapter~3]{Gil:2007}. Routine \code{expint\_E2} computes $E_2(x)$ using \code{expint\_E1} with relation \eqref{eq:En:recurrence} for $x < 100$, and using the asymptotic expression \eqref{eq:En:asymptotic} otherwise. Routine \code{expint\_En} simply relies on \code{gamma\_inc} to compute $E_n(x)$ for $n > 2$ through relation \eqref{eq:En_vs_gammainc}. For the sake of providing routines that better fit within the R ecosystem and coding style, we made the following changes to the original GSL code: \begin{enumerate} \item routines now compute a single value and return their result by value; \item accordingly, calculation of the approximation error was dropped in all routines; \item most importantly, \code{gamma\_inc} does not compute $\Gamma(a, x)$ for $a > 0$ with \eqref{eq:gammainc_vs_pgamma} using the GSL routines, but rather using routines \code{gammafn} and \code{pgamma} part of the R API. \end{enumerate} The following illustrates the last point. <>= op <- options() # remember default number of digits @ <>= options(digits = 20) gammainc(1.2, 3) gamma(1.2) * pgamma(3, 1.2, 1, lower = FALSE) @ <>= options(op) # restore defaults @ \section{Alternative packages} \label{sec:alternatives} The Comprehensive R Archive Network\footnote{% \url{https://cran.r-project.org}} % (CRAN) contains a number of packages with features overlapping \pkg{expint}. We review the similarities and differences here. The closest package in functionality is \pkg{gsl} \citep{gsl-package}. This package is an R wrapper for the special functions and quasi random number generators of the GNU Scientific Library. As such, it provides access to basically the same C code as used in \pkg{expint}. Apart from the changes to the GSL code mentioned in \autoref{sec:implementation}, the main difference between the two packages is that \pkg{gsl} requires that the GSL be installed on one's system, whereas \pkg{expint} is a regular, free standing R package. Package \pkg{VGAM} \citep{VGAM} is a large, high quality package that provides functions to compute the exponential integral $\Ei(x)$ for real values, as well as $e^{-x} \Ei(x)$ and $E_1(x)$ and their derivatives (up to the third derivative). Functions \code{expint}, \code{expexpint} and \code{expint.E1} are wrappers to the Netlib\footnote{% \url{http://www.netlib.org}} % FORTRAN subroutines in file \code{ei.f}. \pkg{VGAM} does not provide an API to its C routines. Package \pkg{pracma} \citep{pracma} provides a large number of functions from numerical analysis, linear algebra, numerical optimization, differential equations and special functions. Its versions of \code{expint}, \code{expint\_E1}, \code{expint\_Ei} and \code{gammainc} are entirely written in R with perhaps less focus on numerical accuracy than the GSL and Netlib implementations. The version of \code{gammainc} only supports positive values of $a$. Package \pkg{frmqa} \citep{frmqa} has a function \code{gamma\_inc\_err} that computes the incomplete gamma function using the incomplete Laplace integral, but it is only valid for $a = j + \frac{1}{2}$, $j = 0, 1, 2, \dots$. Package \pkg{zipfR} \citep{zipfR} introduces a set of functions to compute various quantities related to the gamma and incomplete gamma functions, but these are essentially wrappers around the base R functions \code{gamma} and \code{pgamma} with no new functionalities. \section{Examples} \label{sec:examples} We tabulate the values of $E_n(x)$ for $x = 1.275, 10, 12.3$ and $n = 1, 2, \dots, 10$ as found in examples~4--6 of \citet[section~5.3]{Abramowitz:1972}. <>= x <- c(1.275, 10, 12.3) n <- 1:10 structure(t(outer(x, n, expint)), dimnames = list(n, paste("x =", x))) @ We also tabulate the values of $\Gamma(a, x)$ for $a = -1.5, -1, -0.5, 1$ and $x = 1, 2, \dots, 10$. <>= a <- c(-1.5, -1, -0.5, 1) x <- 1:10 structure(t(outer(a, x, gammainc)), dimnames = list(x, paste("a =", a))) @ \section{Acknowledgments} We built on the source code of R and many of the packages cited in this paper to create \pkg{expint}, so the R Core Team and the package developers deserve credit. We also extend our thanks to Dirk Eddelbuettel who was of great help in putting together the package API, through both his posts in online forums and private communication. Joshua Ulrich provided a fix to the API infrastructure to avoid duplicated symbols that was implemented in version 0.1-6 of the package. \bibliography{expint} \end{document} expint/inst/doc/expint.R0000644000176200001440000000366514326667553014770 0ustar liggesusers### R code from vignette source 'expint.Rnw' ################################################### ### code chunk number 1: expint.Rnw:76-78 ################################################### library(expint) options(width = 60) ################################################### ### code chunk number 2: expint.Rnw:242-243 ################################################### expint(c(1.275, 10, 12.3), order = 1:3) ################################################### ### code chunk number 3: expint.Rnw:257-260 ################################################### expint_E1(1.275) expint_E2(10) expint_En(12.3, order = 3L) ################################################### ### code chunk number 4: expint.Rnw:265-267 ################################################### expint_Ei(5) -expint_E1(-5) # same ################################################### ### code chunk number 5: expint.Rnw:382-383 ################################################### op <- options() # remember default number of digits ################################################### ### code chunk number 6: expint.Rnw:385-388 ################################################### options(digits = 20) gammainc(1.2, 3) gamma(1.2) * pgamma(3, 1.2, 1, lower = FALSE) ################################################### ### code chunk number 7: expint.Rnw:390-391 ################################################### options(op) # restore defaults ################################################### ### code chunk number 8: expint.Rnw:449-453 ################################################### x <- c(1.275, 10, 12.3) n <- 1:10 structure(t(outer(x, n, expint)), dimnames = list(n, paste("x =", x))) ################################################### ### code chunk number 9: expint.Rnw:458-462 ################################################### a <- c(-1.5, -1, -0.5, 1) x <- 1:10 structure(t(outer(a, x, gammainc)), dimnames = list(x, paste("a =", a))) expint/inst/include/0000755000176200001440000000000014220225222014152 5ustar liggesusersexpint/inst/include/expintAPI.h0000644000176200001440000000256514220225222016174 0ustar liggesusers/* == expint: Exponential Integral and Incomplete Gamma Function == * * Support for exported functions at the C level. * * This is derived from code in package zoo. * * Copyright (C) 2016 Vincent Goulet * Copyright (C) 2010 Jeffrey A. Ryan jeff.a.ryan @ gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * AUTHOR: Vincent Goulet */ #include #include #include #ifdef __cplusplus extern "C" { #endif double expint_E1(double x, int scale); double expint_E2(double x, int scale); double expint_En(double x, int order, int scale); double gamma_inc(double a, double x); #ifdef __cplusplus } #endif expint/inst/CITATION0000644000176200001440000000142514220225222013666 0ustar liggesuserscitHeader("To cite expint in publications use:") citEntry(entry="Manual", title = "expint: Exponential Integral and Incomplete Gamma Function", author = person("Vincent", "Goulet", email = "vincent.goulet@act.ulaval.ca"), year = 2016, note = "R package", url = "https://cran.r-project.org/package=expint", textVersion = paste("V. Goulet (2016).", "expint: Exponential Integral and Incomplete Gamma Function", "R package", "URL https://cran.r-project.org/package=expint") ) citFooter("We have invested a lot of time and effort in creating expint,", "please cite both the package and R when using them for data analysis.", "See also", sQuote("citation()"), "for citing R.") expint/inst/NEWS.Rd0000644000176200001440000000624514326667517013631 0ustar liggesusers\name{NEWS} \title{\pkg{expint} News} \encoding{UTF-8} \section{CHANGES IN \pkg{expint} VERSION 0.1-8}{ \subsection{NEW FEATURE}{ \itemize{ \item{Unit tests for the incomplete gamma function based on the definition, and for the exponential integrals based on table of Abramowitz and Stegun.} } } \subsection{BUG FIXES}{ \itemize{ \item{Include prototypes for all C level functions to please \code{-Wstrict-prototypes}.} } } } \section{CHANGES IN \pkg{expint} VERSION 0.1-7}{ \subsection{BUG FIXES}{ \itemize{ \item{Replace deprecated (as of R 4.2.0) macro \code{DOUBLE_EPS} by \code{DBL_EPSILON} in C code.} \item{Remove the unnecessary \code{LazyData} entry in the \code{DESCRIPTION} file.} } } } \section{CHANGES IN \pkg{expint} VERSION 0.1-6}{ \itemize{ \item{Fixed the example API and the documentation in the vignette. The previous implementation yielded duplicated symbols with option \code{-fno-common} that will be the default in gcc starting with version 10.0.x. Thanks to Joshua Ulrich \email{josh.m.ulrich@gmail.com}, maintainer of \pkg{xts} and \pkg{TTR} for proposing the fix.} } } \section{CHANGES IN \pkg{expint} VERSION 0.1-5}{ \itemize{ \item{Minor documentation and comments updates.} } } \section{CHANGES IN \pkg{expint} VERSION 0.1-4}{ \subsection{BUG FIX}{ \itemize{ \item{Usage of \code{R_useDynamicSymbols} to preclude compilation \code{NOTE}s, better registration of native routines and reduced symbol visibility.} \item{Vignette no longer uses LaTeX package framed as it was not found on OS X in CRAN builds.} } } } \section{CHANGES IN \pkg{expint} VERSION 0.1-3}{ \subsection{BUG FIX}{ \itemize{ \item{Fixed wrong values for expint_E1(x, scale = TRUE) for x in (-4, -1] or x in (0, 1]. Thanks to Vincent Dorie \email{vjd4@nyu.edu} for the catch and report.} } } } \section{CHANGES IN \pkg{expint} VERSION 0.1-2}{ \itemize{ \item{Yet more authors (actually copyright holders) added to the list of authors.} } } \section{CHANGES IN \pkg{expint} VERSION 0.1-1}{ \subsection{BUG FIX}{ \itemize{ \item{Fixed improper use of macro \code{ISNAN} (and \code{ISNA}) that caused compilation to fail on Linux and Solaris.} } } \subsection{OTHER CHANGES}{ \itemize{ \item{Original author of GSL code for \code{expint} and \code{gamma_inc} (G. Jungman) added as an author of the package.} \item{Improved (read: more explicit) copyright notices to GSL, R Core Team and R Foundation where appropriate.} } } } \section{CHANGES IN \pkg{expint} VERSION 0.1-0}{ \itemize{ \item{Initial release. The package provides the \R functions to compute the exponential integrals \eqn{E_1(x)}, \eqn{E_2(x)}, \eqn{E_n(x)} and \eqn{Ei(x)}, and the incomplete gamma function \eqn{G(a, x)}. The package also provides a C API to access the actual workhorses \code{expint_E1}, \code{expint_E2}, \code{expint_En} and \code{gamma_inc}. Sub-directory \file{example_API} of the package installation directory contains a complete test package implementing API usage.} } } expint/inst/example_API/0000755000176200001440000000000014220225222014653 5ustar liggesusersexpint/inst/example_API/NAMESPACE0000644000176200001440000000013414220225222016070 0ustar liggesusers### C code useDynLib(pkg, .registration = TRUE) import(expint) ### Exports export(foo,bar) expint/inst/example_API/man/0000755000176200001440000000000014220225222015426 5ustar liggesusersexpint/inst/example_API/man/pkg.Rd0000644000176200001440000000130514220225222016475 0ustar liggesusers\name{foo} \alias{foo} \alias{bar} \title{Test functions} \description{ These functions test the interface to the C routines of package \pkg{expint}. } \usage{ foo(x) bar(a, x) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x, a}{vectors of real numbers} } \details{ \code{foo} is an interface to \code{expint_E1}. \code{bar} is an interface to \code{gamma_inc}. Both functions are vectorized. } \value{ ... } \author{ ~~who you are~~ } \seealso{ ~~objects to See Also as \code{\link{help}}, ~~~ } \examples{ ## Compare results with functions expint() and gammainc() ## of package expint foo(1.275) x <- c(0.2, 2.5, 5, 8, 10) a <- 1.2 bar(a, x) } \keyword{math} expint/inst/example_API/DESCRIPTION0000644000176200001440000000064214220225222016363 0ustar liggesusersPackage: pkg Type: Package Title: Test package Version: 0.0-1 Date: 2016-12-25 Authors@R: c(person("Vincent", "Goulet", role = c("cre", "aut"), email = "vincent.goulet@act.ulaval.ca")) Description: Tests the interface to include the C routines of package expint in another package. Depends: R (>= 3.3.0) Imports: expint LinkingTo: expint License: GPL (>= 2) Encoding: UTF-8 LazyLoad: yes LazyData: yes expint/inst/example_API/src/0000755000176200001440000000000014220225222015442 5ustar liggesusersexpint/inst/example_API/src/foo.c0000644000176200001440000000422314220225222016372 0ustar liggesusers/* * Example of a routine making use of the interface defined in * init.c. The routine will iterate on both arguments passed from R, * thereby making the R function vectorized. * * The code is derived from package actuar and base R. * * Copyright (C) 2016 Vincent Goulet * Copyright (C) 1995--1997 Robert Gentleman and Ross Ihaka * Copyright (C) 1998--2016 The R Core Team. * Copyright (C) 2003--2016 The R Foundation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "pkg.h" SEXP pkg_do_foo(SEXP args) { SEXP sx, sy; int i, nx; double xi, *x, *y; Rboolean naflag = FALSE; if (!isNumeric(CADR(args))) error(_("invalid arguments")); nx = LENGTH(CADR(args)); if (nx == 0) return(allocVector(REALSXP, 0)); PROTECT(sx = coerceVector(CADR(args), REALSXP)); PROTECT(sy = allocVector(REALSXP, nx)); x = REAL(sx); y = REAL(sy); for (i = 0; i < nx; i++) { xi = x[i]; if (ISNA(xi)) y[i] = NA_REAL; \ else if (ISNAN(xi)) y[i] = R_NaN; else { /* this is where the expint routine is used */ y[i] = pkg_expint_E1(xi, 0); if (ISNAN(y[i])) naflag = TRUE; } } if (naflag) warning(R_MSG_NA); SET_ATTRIB(sy, duplicate(ATTRIB(sx))); SET_OBJECT(sy, OBJECT(sx)); UNPROTECT(2); return sy; } expint/inst/example_API/src/locale.h0000644000176200001440000000023414220225222017051 0ustar liggesusers/* Localization */ #include #ifdef ENABLE_NLS #include #define _(String) dgettext ("pkg", String) #else #define _(String) (String) #endif expint/inst/example_API/src/init.c0000644000176200001440000000404414220225222016553 0ustar liggesusers/* * Native routines registration, as per "Writing R extensions" and * definition of native interfaces to two routines exported by * package expint. * * This is derived from code in packages zoo and xts. * * Copyright (C) 2016 Vincent Goulet * Copyright (C) 2010 Jeffrey A. Ryan jeff.a.ryan @ gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * AUTHOR: Vincent Goulet */ #include #include #include /* this is actually optional */ #include "pkg.h" /* This package uses the .External interface between R and C */ static const R_ExternalMethodDef ExternalEntries[] = { {"pkg_do_foo", (DL_FUNC) &pkg_do_foo, -1}, {"pkg_do_bar", (DL_FUNC) &pkg_do_bar, -1}, {NULL, NULL, 0} }; /* Routine registration and native interfaces definitions. We prefix * names with pkg_ to avoid name clashes with expintAPI.h. */ void R_init_pkg(DllInfo *dll) { R_registerRoutines(dll, NULL, NULL, NULL, ExternalEntries); /* native interfaces to routines from package expint */ pkg_expint_E1 = (double(*)(double,int)) R_GetCCallable("expint", "expint_E1"); pkg_gamma_inc = (double(*)(double,double)) R_GetCCallable("expint", "gamma_inc"); } /* Declaration of interfaces to routines from package expint */ double(*pkg_expint_E1)(double,int); double(*pkg_gamma_inc)(double,double); expint/inst/example_API/src/pkg.h0000644000176200001440000000050714220225222016376 0ustar liggesusers#include /* Error messages */ #define R_MSG_NA _("NaNs produced") /* Functions accessed from .External() */ SEXP pkg_do_foo(SEXP args); SEXP pkg_do_bar(SEXP args); /* Interfaces to routines from package expint */ extern double(*pkg_expint_E1)(double,int); extern double(*pkg_gamma_inc)(double,double); expint/inst/example_API/src/bar.c0000644000176200001440000000546214220225222016361 0ustar liggesusers/* * Example of a routine making use of the interface defined in * init.c. The routine will iterate on both arguments passed from R, * thereby making the R function vectorized. * * The code is derived from package actuar and base R. * * Copyright (C) 2016 Vincent Goulet * Copyright (C) 1995--1997 Robert Gentleman and Ross Ihaka * Copyright (C) 1998--2016 The R Core Team. * Copyright (C) 2003--2016 The R Foundation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * AUTHOR: Vincent Goulet */ #include #include #include "locale.h" #include "pkg.h" #define mod_iterate1(n1, n2, i1, i2) \ for (i = i1 = i2 = 0; i < n; \ i1 = (++i1 == n1) ? 0 : i1, \ i2 = (++i2 == n2) ? 0 : i2, \ ++i) SEXP pkg_do_bar(SEXP args) { SEXP sx, sa, sy; int i, ix, ia, n, nx, na; double ai, *a, xi, *x, *y; Rboolean naflag = FALSE; args = CDR(args); /* drop function name from arguments */ if (!isNumeric(CAR(args)) || !isNumeric(CADR(args))) error(_("invalid arguments")); na = LENGTH(CAR(args)); nx = LENGTH(CADR(args)); if ((na == 0) || (nx == 0)) return(allocVector(REALSXP, 0)); n = (nx < na) ? na : nx; PROTECT(sa = coerceVector(CAR(args), REALSXP)); PROTECT(sx = coerceVector(CADR(args), REALSXP)); PROTECT(sy = allocVector(REALSXP, n)); a = REAL(sa); x = REAL(sx); y = REAL(sy); mod_iterate1(na, nx, ia, ix) { ai = a[ia]; xi = x[ix]; if (ISNA(ai) || ISNA(xi)) y[i] = NA_REAL; else if (ISNAN(ai) || ISNAN(xi)) y[i] = R_NaN; else { /* this is where the expint routine is used */ y[i] = pkg_gamma_inc(ai, xi); if (ISNAN(y[i])) naflag = TRUE; } } if (naflag) warning(R_MSG_NA); if (n == na) { SET_ATTRIB(sy, duplicate(ATTRIB(sa))); SET_OBJECT(sy, OBJECT(sa)); } else if (n == nx) { SET_ATTRIB(sy, duplicate(ATTRIB(sx))); SET_OBJECT(sy, OBJECT(sx)); } UNPROTECT(3); return sy; } expint/inst/example_API/R/0000755000176200001440000000000014220225222015054 5ustar liggesusersexpint/inst/example_API/R/pkg.R0000644000176200001440000000015314220225222015757 0ustar liggesusersfoo <- function(x) .External("pkg_do_foo", x) bar <- function(a, x) .External("pkg_do_bar", a, x) expint/po/0000755000176200001440000000000014220225222012170 5ustar liggesusersexpint/po/expint.pot0000644000176200001440000000263314220225222014227 0ustar liggesusers# expint: Exponential Integrals and Incomplete Gamma Function # Copyright (C) 2016 Vincent Goulet # This file is distributed under the same license as the expint package. # Vincent Goulet , 2016 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: expint 1.0-0\n" "Report-Msgid-Bugs-To: Vincent Goulet\n" "POT-Creation-Date: 2016-12-15 00:43-0500\n" "PO-Revision-Date: 2016-12-20 01:57-0500\n" "Last-Translator: Vincent Goulet \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: expint.c:352 expint.c:347 msgid "overflow in expint_E1" msgstr "" #: expint.c:398 expint.c:405 expint.c:393 expint.c:400 msgid "underflow in expint_E1" msgstr "" #: expint.c:423 expint.c:418 msgid "overflow in expint_E2" msgstr "" #: expint.c:457 expint.c:464 expint.c:452 expint.c:459 msgid "underflow in expint_E2" msgstr "" #: expint.c:472 expint.c:467 msgid "underflow in expint_En" msgstr "" #: expint.c:543 expint.c:612 gamma_inc.c:266 expint.c:538 expint.c:607 msgid "invalid arguments" msgstr "" #: expint.c:588 expint.c:583 msgid "internal error in expint_do_expint1" msgstr "" #: expint.c:677 expint.c:672 msgid "internal error in expint_do_expint2" msgstr "" #: gamma_inc.c:91 gamma_inc.c:190 msgid "maximum number of iterations reached in gamma_inc_F_CF" msgstr "" expint/po/fr.po0000644000176200001440000000342514220225222013143 0ustar liggesusers# expint: Exponential Integrals and Incomplete Gamma Function # Copyright (C) 2016 Vincent Goulet # This file is distributed under the same license as the expint package. # Vincent Goulet , 2016 # msgid "" msgstr "" "Project-Id-Version: expint 1.0-0\n" "Report-Msgid-Bugs-To: Vincent Goulet\n" "POT-Creation-Date: 2016-12-15 00:43-0500\n" "PO-Revision-Date: 2016-12-15 00:56-0500\n" "Last-Translator: Vincent Goulet \n" "Language-Team: French\n" "Language: fr_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: expint.c:352 expint.c:347 msgid "overflow in expint_E1" msgstr "dépassement de capacité dans expint_E1" #: expint.c:398 expint.c:405 expint.c:393 expint.c:400 msgid "underflow in expint_E1" msgstr "soupassement de capacité dans expint_E1" #: expint.c:423 expint.c:418 msgid "overflow in expint_E2" msgstr "dépassement de capacité dans expint_E2" #: expint.c:457 expint.c:464 expint.c:452 expint.c:459 msgid "underflow in expint_E2" msgstr "soupassement de capacité dans expint_E2" #: expint.c:472 expint.c:467 msgid "underflow in expint_En" msgstr "soupassement de capacité dans expint_En" #: expint.c:543 expint.c:612 gamma_inc.c:266 expint.c:538 expint.c:607 msgid "invalid arguments" msgstr "arguments incorrects" #: expint.c:588 expint.c:583 msgid "internal error in expint_do_expint1" msgstr "erreur interne dans expint_do_expint1" #: expint.c:677 expint.c:672 msgid "internal error in expint_do_expint2" msgstr "erreur interne dans expint_do_expint2" #: gamma_inc.c:91 gamma_inc.c:190 msgid "maximum number of iterations reached in gamma_inc_F_CF" msgstr "nombre d'itérations maximal atteint dans gamma_inc_F_CF"