1 /*
2 * R : A Computer Language for Statistical Data Analysis
3 * Copyright (C) 2001-2021 The R Core Team.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, a copy is available at
17 * https://www.R-project.org/Licenses/
18 */
19
20 #include "modreg.h"
21 #include "nls.h"
22 #include "port.h"
23 #include "stats.h"
24 #include "statsR.h"
25 #include "ts.h"
26 #include <R_ext/Rdynload.h>
27 #include <R_ext/Visibility.h>
28
29 #define C_DEF(name, n) {#name, (DL_FUNC) &name, n}
30
31 static const R_CMethodDef CEntries[] = {
32 C_DEF(loess_raw, 24),
33 C_DEF(loess_dfit, 13),
34 C_DEF(loess_dfitse, 16),
35 C_DEF(loess_ifit, 8),
36 C_DEF(loess_ise, 15),
37 C_DEF(multi_burg, 11),
38 C_DEF(multi_yw, 10),
39 C_DEF(HoltWinters, 17),
40 C_DEF(kmeans_Lloyd, 9),
41 C_DEF(kmeans_MacQueen, 9),
42 C_DEF(rcont2, 8),
43 {NULL, NULL, 0}
44 };
45
46 #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n}
47
48 #define CALLDEF_DO(name, n) {#name, (DL_FUNC) &do_##name, n}
49 #define CALLDEF_MATH2_1(name) CALLDEF_DO(name, 3)
50 #define CALLDEF_MATH2_2(name) CALLDEF_DO(name, 4)
51 #define CALLDEF_MATH3_1(name) CALLDEF_DO(name, 4)
52 #define CALLDEF_MATH3_2(name) CALLDEF_DO(name, 5)
53 #define CALLDEF_MATH4_1(name) CALLDEF_DO(name, 5)
54 #define CALLDEF_MATH4_2(name) CALLDEF_DO(name, 6)
55
56 #define CALLDEF_RAND1(name) CALLDEF_DO(name, 2)
57 #define CALLDEF_RAND2(name) CALLDEF_DO(name, 3)
58 #define CALLDEF_RAND3(name) CALLDEF_DO(name, 4)
59
60 static const R_CallMethodDef CallEntries[] = {
61 CALLDEF(cutree, 2),
62 CALLDEF(isoreg, 1),
63 CALLDEF(monoFC_m, 2),
64 CALLDEF(numeric_deriv, 6),
65 CALLDEF(nls_iter, 3),
66 CALLDEF(setup_starma, 8),
67 CALLDEF(free_starma, 1),
68 CALLDEF(set_trans, 2),
69 CALLDEF(arma0fa, 2),
70 CALLDEF(get_s2, 1),
71 CALLDEF(get_resid, 1),
72 CALLDEF(Dotrans, 2),
73 CALLDEF(arma0_kfore, 4),
74 CALLDEF(Starma_method, 2),
75 CALLDEF(Invtrans, 2),
76 CALLDEF(Gradtrans, 2),
77 CALLDEF(ARMAtoMA, 3),
78 CALLDEF(KalmanLike, 5),
79 CALLDEF(KalmanFore, 3),
80 CALLDEF(KalmanSmooth, 3),
81 CALLDEF(ARIMA_undoPars, 2),
82 CALLDEF(ARIMA_transPars, 3),
83 CALLDEF(ARIMA_Invtrans, 2),
84 CALLDEF(ARIMA_Gradtrans, 2),
85 CALLDEF(ARIMA_Like, 4),
86 CALLDEF(ARIMA_CSS, 6),
87 CALLDEF(TSconv, 2),
88 CALLDEF(getQ0, 2),
89 CALLDEF(getQ0bis, 3),
90 CALLDEF(port_ivset, 3),
91 CALLDEF(port_nlminb, 9),
92 CALLDEF(port_nlsb, 7),
93 CALLDEF(logit_link, 1),
94 CALLDEF(logit_linkinv, 1),
95 CALLDEF(logit_mu_eta, 1),
96 CALLDEF(binomial_dev_resids, 3),
97 CALLDEF(rWishart, 3),
98 CALLDEF(Cdqrls, 4),
99 CALLDEF(Cdist, 4),
100 CALLDEF(cor, 4),
101 CALLDEF(cov, 4),
102 CALLDEF(updateform, 2),
103 CALLDEF(fft, 2),
104 CALLDEF(mvfft, 2),
105 CALLDEF(nextn, 2),
106 CALLDEF(r2dtable, 3),
107 CALLDEF(cfilter, 4),
108 CALLDEF(rfilter, 3),
109 CALLDEF(lowess, 5),
110 CALLDEF(DoubleCentre, 1),
111 CALLDEF(BinDist, 5),
112 CALLDEF(Rsm, 3),
113 CALLDEF(tukeyline, 4),
114 CALLDEF(runmed, 6),
115 CALLDEF(influence, 3),
116 CALLDEF(pSmirnov2x, 3),
117 CALLDEF(pKolmogorov2x, 2),
118 CALLDEF(pKS2, 2),
119 CALLDEF(ksmooth, 5),
120 CALLDEF(SplineCoef, 3),
121 CALLDEF(SplineEval, 2),
122 CALLDEF(Approx, 8),
123 CALLDEF(ApproxTest, 5),
124 CALLDEF(LogLin, 7),
125 CALLDEF(pAnsari, 3),
126 CALLDEF(qAnsari, 3),
127 CALLDEF(pKendall, 2),
128 CALLDEF(pRho, 3),
129 CALLDEF(SWilk, 1),
130 CALLDEF(bw_den, 2),
131 CALLDEF(bw_den_binned, 1),
132 CALLDEF(bw_ucv, 4),
133 CALLDEF(bw_bcv, 4),
134 CALLDEF(bw_phi4, 4),
135 CALLDEF(bw_phi6, 4),
136 CALLDEF(acf, 3),
137 CALLDEF(pacf1, 2),
138 CALLDEF(ar2ma, 2),
139 CALLDEF(Burg, 2),
140 CALLDEF(intgrt_vec, 3),
141 CALLDEF(pp_sum, 2),
142 CALLDEF(Fexact, 4),
143 CALLDEF(Fisher_sim, 3),
144 CALLDEF(chisq_sim, 4),
145 CALLDEF(d2x2xk, 5),
146
147 CALLDEF_MATH2_1(dchisq),
148 CALLDEF_MATH2_1(dexp),
149 CALLDEF_MATH2_1(dgeom),
150 CALLDEF_MATH2_1(dpois),
151 CALLDEF_MATH2_1(dt),
152 CALLDEF_MATH2_1(dsignrank),
153 CALLDEF_MATH2_2(pchisq),
154 CALLDEF_MATH2_2(qchisq),
155 CALLDEF_MATH2_2(pexp),
156 CALLDEF_MATH2_2(qexp),
157 CALLDEF_MATH2_2(pgeom),
158 CALLDEF_MATH2_2(qgeom),
159 CALLDEF_MATH2_2(ppois),
160 CALLDEF_MATH2_2(qpois),
161 CALLDEF_MATH2_2(pt),
162 CALLDEF_MATH2_2(qt),
163 CALLDEF_MATH2_2(psignrank),
164 CALLDEF_MATH2_2(qsignrank),
165
166 CALLDEF_MATH3_1(dbeta),
167 CALLDEF_MATH3_1(dbinom),
168 CALLDEF_MATH3_1(dcauchy),
169 CALLDEF_MATH3_1(df),
170 CALLDEF_MATH3_1(dgamma),
171 CALLDEF_MATH3_1(dlnorm),
172 CALLDEF_MATH3_1(dlogis),
173 CALLDEF_MATH3_1(dnbinom),
174 CALLDEF_MATH3_1(dnbinom_mu),
175 CALLDEF_MATH3_1(dnorm),
176 CALLDEF_MATH3_1(dweibull),
177 CALLDEF_MATH3_1(dunif),
178 CALLDEF_MATH3_1(dnt),
179 CALLDEF_MATH3_1(dnchisq),
180 CALLDEF_MATH3_1(dwilcox),
181 CALLDEF_MATH3_2(pbeta),
182 CALLDEF_MATH3_2(qbeta),
183 CALLDEF_MATH3_2(pbinom),
184 CALLDEF_MATH3_2(qbinom),
185 CALLDEF_MATH3_2(pcauchy),
186 CALLDEF_MATH3_2(qcauchy),
187 CALLDEF_MATH3_2(pf),
188 CALLDEF_MATH3_2(qf),
189 CALLDEF_MATH3_2(pgamma),
190 CALLDEF_MATH3_2(qgamma),
191 CALLDEF_MATH3_2(plnorm),
192 CALLDEF_MATH3_2(qlnorm),
193 CALLDEF_MATH3_2(plogis),
194 CALLDEF_MATH3_2(qlogis),
195 CALLDEF_MATH3_2(pnbinom),
196 CALLDEF_MATH3_2(qnbinom),
197 CALLDEF_MATH3_2(pnbinom_mu),
198 CALLDEF_MATH3_2(qnbinom_mu),
199 CALLDEF_MATH3_2(pnorm),
200 CALLDEF_MATH3_2(qnorm),
201 CALLDEF_MATH3_2(pweibull),
202 CALLDEF_MATH3_2(qweibull),
203 CALLDEF_MATH3_2(punif),
204 CALLDEF_MATH3_2(qunif),
205 CALLDEF_MATH3_2(pnt),
206 CALLDEF_MATH3_2(qnt),
207 CALLDEF_MATH3_2(pnchisq),
208 CALLDEF_MATH3_2(qnchisq),
209 CALLDEF_MATH3_2(pwilcox),
210 CALLDEF_MATH3_2(qwilcox),
211 // {"qnbinom_mu", (DL_FUNC) &distn3, 5}, // exists but currently unused
212
213 CALLDEF_MATH4_1(dhyper),
214 CALLDEF_MATH4_1(dnbeta),
215 CALLDEF_MATH4_1(dnf),
216 CALLDEF_MATH4_2(phyper),
217 CALLDEF_MATH4_2(qhyper),
218 CALLDEF_MATH4_2(pnbeta),
219 CALLDEF_MATH4_2(qnbeta),
220 CALLDEF_MATH4_2(pnf),
221 CALLDEF_MATH4_2(qnf),
222 CALLDEF_MATH4_2(ptukey),
223 CALLDEF_MATH4_2(qtukey),
224
225 CALLDEF_RAND1(rchisq),
226 CALLDEF_RAND1(rexp),
227 CALLDEF_RAND1(rgeom),
228 CALLDEF_RAND1(rpois),
229 CALLDEF_RAND1(rt),
230 CALLDEF_RAND1(rsignrank),
231
232 CALLDEF_RAND2(rbeta),
233 CALLDEF_RAND2(rbinom),
234 CALLDEF_RAND2(rcauchy),
235 CALLDEF_RAND2(rf),
236 CALLDEF_RAND2(rgamma),
237 CALLDEF_RAND2(rlnorm),
238 CALLDEF_RAND2(rlogis),
239 CALLDEF_RAND2(rnbinom),
240 CALLDEF_RAND2(rnorm),
241 CALLDEF_RAND2(runif),
242 CALLDEF_RAND2(rweibull),
243 CALLDEF_RAND2(rwilcox),
244 CALLDEF_RAND2(rnchisq),
245 CALLDEF_RAND2(rnbinom_mu),
246
247 CALLDEF_RAND3(rhyper),
248
249 CALLDEF_DO(rmultinom, 3),
250
251 {NULL, NULL, 0}
252 };
253
254 #define FDEF(name) {#name, (DL_FUNC) &F77_NAME(name), sizeof(name ## _types)/sizeof(name ## _types[0]), name ##_types}
255
256
257 static R_NativePrimitiveArgType lowesw_types[] = {
258 REALSXP, INTSXP, REALSXP, INTSXP};
259 static R_NativePrimitiveArgType lowesp_types[] = {
260 INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, REALSXP};
261
262
263 static const R_FortranMethodDef FortEntries[] = {
264 FDEF(lowesw),
265 FDEF(lowesp),
266 {"setppr", (DL_FUNC) &F77_NAME(setppr), 6},
267 {"smart", (DL_FUNC) &F77_NAME(smart), 16},
268 {"pppred", (DL_FUNC) &F77_NAME(pppred), 5},
269 {"setsmu", (DL_FUNC) &F77_NAME(setsmu), 1},
270 {"rbart", (DL_FUNC) &F77_NAME(rbart), 20},
271 {"bvalus", (DL_FUNC) &F77_NAME(bvalus), 7},
272 {"supsmu", (DL_FUNC) &F77_NAME(supsmu), 10},
273 {"hclust", (DL_FUNC) &F77_NAME(hclust), 10},
274 {"hcass2", (DL_FUNC) &F77_NAME(hcass2), 6},
275 {"kmns", (DL_FUNC) &F77_NAME(kmns), 17},
276 {"eureka", (DL_FUNC) &F77_NAME(eureka), 6},
277 {"stl", (DL_FUNC) &F77_NAME(stl), 18},
278 {NULL, NULL, 0}
279 };
280
281 #define EXTDEF(name, n) {#name, (DL_FUNC) &name, n}
282 // These argument counts are not checked
283 static const R_ExternalMethodDef ExtEntries[] = {
284 EXTDEF(compcases, -1),
285 EXTDEF(doD, 2),
286 EXTDEF(deriv, 5),
287 EXTDEF(modelframe, 8),
288 EXTDEF(modelmatrix, 2),
289 EXTDEF(termsform, 5),
290 EXTDEF(do_fmin, 4),
291 EXTDEF(nlm, 11),
292 EXTDEF(zeroin2, 7),
293 EXTDEF(optim, 7),
294 EXTDEF(optimhess, 4),
295 EXTDEF(call_dqags, 7),
296 EXTDEF(call_dqagi, 7),
297
298 {"signrank_free", (DL_FUNC) &stats_signrank_free, 0},
299 {"wilcox_free", (DL_FUNC) &stats_wilcox_free, 0},
300 {NULL, NULL, 0}
301 };
302
303
R_init_stats(DllInfo * dll)304 void attribute_visible R_init_stats(DllInfo *dll)
305 {
306 R_registerRoutines(dll, CEntries, CallEntries, FortEntries, ExtEntries);
307 R_useDynamicSymbols(dll, FALSE);
308 R_forceSymbols(dll, TRUE);
309
310 R_RegisterCCallable("stats", "nlminb_iterate", (DL_FUNC) nlminb_iterate);
311 R_RegisterCCallable("stats", "nlsb_iterate", (DL_FUNC) nlsb_iterate);
312 R_RegisterCCallable("stats", "Rf_divset", (DL_FUNC) Rf_divset);
313 R_RegisterCCallable("stats", "rcont2", (DL_FUNC) rcont2);
314 }
315