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