3 // PSPP
- a program for statistical analysis.
4 // Copyright (C
) 2005, 2006, 2009, 2010, 2011, 2012, 2015, 2016 Free Software Foundation
, Inc.
6 // This program is free software
: you can redistribute it and
/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation
, either version
3 of the License
, or
9 // (at your option
) any later version.
11 // This program is distributed in the hope that it will be useful
,
12 // but WITHOUT ANY WARRANTY
; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program. If not
, see
<http
://www.gnu.org
/licenses
/>.
19 operator
NEG (x
) = -x
;
21 operator
ADD (a
, b
) = a
+ b
;
22 operator
SUB (a
, b
) = a
- b
;
24 absorb_miss operator
MUL (a
, b
)
25 = (a
== 0. || b
== 0. ?
0.
26 : a
== SYSMIS || b
== SYSMIS ? SYSMIS
29 absorb_miss operator
DIV (a
, b
)
31 : a
== SYSMIS || b
== SYSMIS ? SYSMIS
34 absorb_miss operator
POW (a
, b
)
35 = (a
== SYSMIS ?
(b
== 0. ?
1.
: a
)
36 : b
== SYSMIS ?
(a
== 0. ?
0.
: SYSMIS
)
37 : a
== 0.
&& b
<= 0. ? SYSMIS
40 absorb_miss boolean operator
AND (boolean a
, boolean b
)
43 : b
== SYSMIS ? SYSMIS
46 absorb_miss boolean operator
OR (boolean a
, boolean b
)
49 : b
== SYSMIS ? SYSMIS
52 boolean operator
NOT (boolean a
)
57 // Numeric relational operators.
58 boolean operator
EQ (a
, b
) = a
== b
;
59 boolean operator
GE (a
, b
) = a
>= b
;
60 boolean operator
GT (a
, b
) = a
> b
;
61 boolean operator
LE (a
, b
) = a
<= b
;
62 boolean operator
LT (a
, b
) = a
< b
;
63 boolean operator
NE (a
, b
) = a
!= b
;
65 // String relational operators.
66 boolean operator
EQ_STRING (string a
, string b
) = compare_string_3way (&a
, &b
) == 0;
67 boolean operator
GE_STRING (string a
, string b
) = compare_string_3way (&a
, &b
) >= 0;
68 boolean operator
GT_STRING (string a
, string b
) = compare_string_3way (&a
, &b
) > 0;
69 boolean operator
LE_STRING (string a
, string b
) = compare_string_3way (&a
, &b
) <= 0;
70 boolean operator
LT_STRING (string a
, string b
) = compare_string_3way (&a
, &b
) < 0;
71 boolean operator
NE_STRING (string a
, string b
) = compare_string_3way (&a
, &b
) != 0;
74 function
ABS (x
) = fabs (x
);
75 extension function
ACOS (x
>= -1 && x
<= 1) = acos (x
);
76 function
ASIN (x
>= -1 && x
<= 1) = asin (x
);
77 function
ATAN (x
) = atan (x
);
78 extension function
ARCOS (x
>= -1 && x
<= 1) = acos (x
);
79 function
ARSIN (x
>= -1 && x
<= 1) = asin (x
);
80 function
ARTAN (x
) = atan (x
);
81 function
COS (x
) = cos (x
);
82 function
EXP (x
) = check_errno (exp (x
));
83 function
LG10(x
) = check_errno (log10 (x
));
84 function
LN (x
) = check_errno (log (x
));
85 function
LNGAMMA (x
>= 0) = gsl_sf_lngamma (x
);
86 function
MOD10 (x
) = fmod (x
, 10);
87 function
RND (x
) = round_nearest (x
, 1, 0);
88 function
RND (x
, mult
!= 0) = round_nearest (x
, mult
, 0);
89 function
RND (x
, mult
!= 0, fuzzbits
>= 0) = round_nearest (x
, mult
, fuzzbits
);
90 function
SIN (x
) = sin (x
);
91 function
SQRT (x
>= 0) = sqrt (x
);
92 function
TAN (x
) = check_errno (tan (x
));
93 function
TRUNC (x
) = round_zero (x
, 1, 0);
94 function
TRUNC (x
, mult
!= 0) = round_zero (x
, mult
, 0);
95 function
TRUNC (x
, mult
!= 0, fuzzbits
>= 0) = round_zero (x
, mult
, fuzzbits
);
97 absorb_miss function
MOD (n
, d
)
100 return n
!= SYSMIS ?
fmod (n
, d
) : SYSMIS
;
102 return n
!= 0. ? SYSMIS
: 0.
;
105 // N
-ary numeric functions.
106 absorb_miss boolean function
ANY (x
!= SYSMIS
, a
[n
])
111 for (i
= 0; i
< n
; i
++)
114 else
if (a
[i
] == SYSMIS
)
117 return sysmis ? SYSMIS
: 0.
;
120 boolean function
ANY (string x
, string a
[n
])
124 for (i
= 0; i
< n
; i
++)
125 if (!compare_string_3way (&x
, &a
[i
]))
130 function CFVAR
.2 (a
[n
])
132 double mean
, variance
;
134 moments_of_doubles (a
, n
, NULL
, &mean
, &variance
, NULL
, NULL
);
136 if (mean
== SYSMIS || mean
== 0 || variance
== SYSMIS
)
139 return
sqrt (variance
) / mean
;
142 function
MAX.1 (a
[n
])
148 for (i
= 0; i
< n
; i
++)
149 if (a
[i
] != SYSMIS
&& a
[i
] > max
)
154 string function
MAX (string a
[n
])
156 struct substring
*max
;
160 for (i
= 1; i
< n
; i
++)
161 if (compare_string_3way (&a
[i
], max
) > 0)
166 function MEAN
.1 (a
[n
])
169 moments_of_doubles (a
, n
, NULL
, &mean
, NULL
, NULL
, NULL
);
173 function MEDIAN
.1 (a
[n
])
175 return
median (a
, n
);
178 function
MIN.1 (a
[n
])
184 for (i
= 0; i
< n
; i
++)
185 if (a
[i
] != SYSMIS
&& a
[i
] < min
)
190 string function
MIN (string a
[n
])
192 struct substring
*min
;
196 for (i
= 1; i
< n
; i
++)
197 if (compare_string_3way (&a
[i
], min
) < 0)
202 absorb_miss function
NMISS (a
[n
])
205 size_t missing_cnt
= 0;
207 for (i
= 0; i
< n
; i
++)
208 missing_cnt
+= a
[i
] == SYSMIS
;
212 absorb_miss function
NVALID (a
[n
])
215 size_t valid_cnt
= 0;
217 for (i
= 0; i
< n
; i
++)
218 valid_cnt
+= a
[i
] != SYSMIS
;
222 absorb_miss boolean function
RANGE (x
!= SYSMIS
, a
[n
*2])
227 for (i
= 0; i
< n
; i
++)
230 double y
= a
[2 * i
+ 1];
231 if (w
!= SYSMIS
&& y
!= SYSMIS
)
233 if (w
<= x
&& x
<= y
)
239 return sysmis ? SYSMIS
: 0.
;
242 boolean function
RANGE (string x
, string a
[n
*2])
246 for (i
= 0; i
< n
; i
++)
248 struct substring
*w
= &a
[2 * i
];
249 struct substring
*y
= &a
[2 * i
+ 1];
250 if (compare_string_3way (w
, &x
) <= 0 && compare_string_3way (&x
, y
) <= 0)
259 moments_of_doubles (a
, n
, NULL
, NULL
, &variance
, NULL
, NULL
);
260 return
sqrt (variance
);
263 function SUM
.1 (a
[n
])
269 for (i
= 0; i
< n
; i
++)
275 function VARIANCE
.2 (a
[n
])
278 moments_of_doubles (a
, n
, NULL
, NULL
, &variance
, NULL
, NULL
);
282 // Time construction
& extraction functions.
283 function TIME.
HMS (h
, m
, s
)
285 if ((h
> 0. || m
> 0. || s
> 0.
) && (h
< 0. || m
< 0. || s
< 0.
))
287 msg (SW
, _("TIME.HMS cannot mix positive and negative arguments."));
291 return H_S
* h
+ MIN_S
* m
+ s
;
293 function TIME.
DAYS (days
) = days
* DAY_S
;
294 function CTIME.
DAYS (time
) = time
/ DAY_S
;
295 function CTIME.
HOURS (time
) = time
/ H_S
;
296 function CTIME.
MINUTES (time
) = time
/ MIN_S
;
297 function CTIME.
SECONDS (time
) = time
;
299 // Date construction functions.
300 function DATE.
DMY (d
, m
, y
) = expr_ymd_to_date (y
, m
, d
);
301 function DATE.
MDY (m
, d
, y
) = expr_ymd_to_date (y
, m
, d
);
302 function DATE.
MOYR (m
, y
) = expr_ymd_to_date (y
, m
, 1);
303 function DATE.
QYR (q
, y
)
305 if (q
< 1.0 || q
> 4.0 || q
!= (int
) q
)
307 msg (SW
, _("The first argument to DATE.QYR must be 1, 2, 3, or 4."));
310 return
expr_ymd_to_date (y
, q
* 3 - 2, 1);
312 function DATE.
WKYR (w
, y
) = expr_wkyr_to_date (w
, y
);
313 function DATE.
YRDAY (y
, yday
) = expr_yrday_to_date (y
, yday
);
314 function
YRMODA (y
, m
, d
) = expr_yrmoda (y
, m
, d
);
316 // Date extraction functions.
317 function XDATE.
TDAY (date
) = floor (date
/ DAY_S
);
318 function XDATE.
HOUR (date
) = fmod (floor (date
/ H_S
), DAY_H
);
319 function XDATE.
MINUTE (date
) = fmod (floor (date
/ H_MIN
), H_MIN
);
320 function XDATE.
SECOND (date
) = fmod (date
, MIN_S
);
321 function XDATE.
DATE (date
) = floor (date
/ DAY_S
) * DAY_S
;
322 function XDATE.
TIME (date
) = fmod (date
, DAY_S
);
324 function XDATE.
JDAY (date
>= DAY_S
) = calendar_offset_to_yday (date
/ DAY_S
);
325 function XDATE.
MDAY (date
>= DAY_S
) = calendar_offset_to_mday (date
/ DAY_S
);
326 function XDATE.
MONTH (date
>= DAY_S
)
327 = calendar_offset_to_month (date
/ DAY_S
);
328 function XDATE.
QUARTER (date
>= DAY_S
)
329 = (calendar_offset_to_month (date
/ DAY_S
) - 1) / 3 + 1;
330 function XDATE.
WEEK (date
>= DAY_S
)
331 = (calendar_offset_to_yday (date
/ DAY_S
) - 1) / 7 + 1;
332 function XDATE.
WKDAY (date
>= DAY_S
) = calendar_offset_to_wday (date
/ DAY_S
);
333 function XDATE.
YEAR (date
>= DAY_S
) = calendar_offset_to_year (date
/ DAY_S
);
335 // Date arithmetic functions.
336 no_abbrev function
DATEDIFF (date2
>= DAY_S
, date1
>= DAY_S
, string unit
)
337 = expr_date_difference (date1
, date2
, unit
);
338 no_abbrev function
DATESUM (date
, quantity
, string unit
)
339 = expr_date_sum (date
, quantity
, unit
, ss_cstr ("closest"));
340 no_abbrev function
DATESUM (date
, quantity
, string unit
, string method
)
341 = expr_date_sum (date
, quantity
, unit
, method
);
345 string function
CONCAT (string a
[n
])
348 struct substring dst
;
351 dst
= alloc_string (e
, MAX_STRING
);
353 for (i
= 0; i
< n
; i
++)
355 struct substring
*src
= &a
[i
];
358 copy_len
= src
->length
;
359 if (dst.length
+ copy_len
> MAX_STRING
)
360 copy_len
= MAX_STRING
- dst.length
;
361 memcpy (&dst.string
[dst.length
], src
->string
, copy_len
);
362 dst.length
+= copy_len
;
368 function
INDEX (string haystack
, string needle
)
370 if (needle.length
== 0)
374 int limit
= haystack.length
- needle.length
+ 1;
376 for (i
= 1; i
<= limit
; i
++)
377 if (!memcmp (&haystack.string
[i
- 1], needle.string
, needle.length
))
383 function
INDEX (string haystack
, string needles
, needle_len_d
)
385 if (needle_len_d
<= INT_MIN || needle_len_d
>= INT_MAX
386 ||
(int
) needle_len_d
!= needle_len_d
387 || needles.length
== 0)
391 int needle_len
= needle_len_d
;
392 if (needle_len
< 0 || needle_len
> needles.length
393 || needles.length
% needle_len
!= 0)
397 int limit
= haystack.length
- needle_len
+ 1;
399 for (i
= 1; i
<= limit
; i
++)
400 for (j
= 0; j
< needles.length
; j
+= needle_len
)
401 if (!memcmp (&haystack.string
[i
- 1], &needles.string
[j
],
409 function
RINDEX (string haystack
, string needle
)
411 if (needle.length
== 0)
415 int limit
= haystack.length
- needle.length
+ 1;
417 for (i
= limit
; i
>= 1; i
--)
418 if (!memcmp (&haystack.string
[i
- 1], needle.string
, needle.length
))
424 function
RINDEX (string haystack
, string needles
, needle_len_d
)
426 if (needle_len_d
<= 0 || needle_len_d
>= INT_MAX
427 ||
(int
) needle_len_d
!= needle_len_d
428 || needles.length
== 0)
432 int needle_len
= needle_len_d
;
433 if (needle_len
< 0 || needle_len
> needles.length
434 || needles.length
% needle_len
!= 0)
438 int limit
= haystack.length
- needle_len
+ 1;
440 for (i
= limit
; i
>= 1; i
--)
441 for (j
= 0; j
< needles.length
; j
+= needle_len
)
442 if (!memcmp (&haystack.string
[i
- 1],
443 &needles.string
[j
], needle_len
))
450 function
LENGTH (string s
)
455 string function
LOWER (string s
)
459 for (i
= 0; i
< s.length
; i
++)
460 s.string
[i
] = tolower ((unsigned char
) s.string
[i
]);
464 function MBLEN.
BYTE (string s
, idx
)
466 if (idx
< 0 || idx
>= s.length ||
(int
) idx
!= idx
)
472 string function
UPCASE (string s
)
476 for (i
= 0; i
< s.length
; i
++)
477 s.string
[i
] = toupper ((unsigned char
) s.string
[i
]);
481 absorb_miss string function
LPAD (string s
, n
)
484 if (n
< 0 || n
> MAX_STRING ||
(int
) n
!= n
)
486 else
if (s.length
>= n
)
490 struct substring t
= alloc_string (e
, n
);
491 memset (t.string
, ' ', n
- s.length
);
492 memcpy (&t.string
[(int
) n
- s.length
], s.string
, s.length
);
497 absorb_miss string function
LPAD (string s
, n
, string c
)
500 if (n
< 0 || n
> MAX_STRING ||
(int
) n
!= n || c.length
!= 1)
502 else
if (s.length
>= n
)
506 struct substring t
= alloc_string (e
, n
);
507 memset (t.string
, c.string
[0], n
- s.length
);
508 memcpy (&t.string
[(int
) n
- s.length
], s.string
, s.length
);
513 string function
REPLACE (string haystack
, string needle
, string replacement
)
515 = replace_string (e
, haystack
, needle
, replacement
, DBL_MAX
);
517 absorb_miss string function
REPLACE (string haystack
, string needle
,
518 string replacement
, n
)
520 = replace_string (e
, haystack
, needle
, replacement
, n
);
522 absorb_miss string function
RPAD (string s
, n
)
525 if (n
< 0 || n
> MAX_STRING ||
(int
) n
!= n
)
527 else
if (s.length
>= n
)
531 struct substring t
= alloc_string (e
, n
);
532 memcpy (t.string
, s.string
, s.length
);
533 memset (&t.string
[s.length
], ' ', n
- s.length
);
538 absorb_miss string function
RPAD (string s
, n
, string c
)
541 if (n
< 0 || n
> MAX_STRING ||
(int
) n
!= n || c.length
!= 1)
543 else
if (s.length
>= n
)
547 struct substring t
= alloc_string (e
, n
);
548 memcpy (t.string
, s.string
, s.length
);
549 memset (&t.string
[s.length
], c.string
[0], n
- s.length
);
554 string function
LTRIM (string s
)
556 while (s.length
> 0 && s.string
[0] == ' ')
564 string function
LTRIM (string s
, string c
)
568 while (s.length
> 0 && s.string
[0] == c.string
[0])
579 string function
RTRIM (string s
)
581 while (s.length
> 0 && s.string
[s.length
- 1] == ' ')
586 string function
RTRIM (string s
, string c
)
590 while (s.length
> 0 && s.string
[s.length
- 1] == c.string
[0])
598 function
NUMBER (string s
, ni_format f
)
605 error
= data_in (s
, C_ENCODING
, f
->type
, settings_get_fmt_settings (),
608 data_in_imply_decimals (s
, C_ENCODING
, f
->type
, f
->d
,
609 settings_get_fmt_settings (), &out
);
612 msg (SE
, "Cannot parse `%.*s' as format %s: %s",
613 (int
) s.length
, s.string
, fmt_name (f
->type
), error
);
619 absorb_miss string function
STRING (x
, no_format f
)
623 struct substring dst
;
628 assert (!fmt_is_string (f
->type
));
629 s
= data_out (&v
, C_ENCODING
, f
, settings_get_fmt_settings ());
630 dst
= alloc_string (e
, strlen (s
));
631 strcpy (dst.string
, s
);
636 absorb_miss string function
STRUNC (string s
, n
)
638 if (n
< 1 || n
== SYSMIS
)
643 while (s.length
> 0 && s.string
[s.length
- 1] == ' ')
648 absorb_miss string function
SUBSTR (string s
, ofs
)
651 if (ofs
>= 1 && ofs
<= s.length
&& (int
) ofs
== ofs
)
652 return
copy_string (e
, &s.string
[(int
) ofs
- 1], s.length
- ofs
+ 1);
657 absorb_miss string function
SUBSTR (string s
, ofs
, cnt
)
660 if (ofs
>= 1 && ofs
<= s.length
&& (int
) ofs
== ofs
661 && cnt
>= 1 && cnt
<= INT_MAX
&& (int
) cnt
== cnt
)
663 int cnt_max
= s.length
- (int
) ofs
+ 1;
664 return
copy_string (e
, &s.string
[(int
) ofs
- 1],
665 cnt
<= cnt_max ? cnt
: cnt_max
);
671 absorb_miss no_opt no_abbrev string function
VALUELABEL (var v
)
675 const char
*label
= var_lookup_value_label (v
, case_data (c
, v
));
677 return
copy_string (e
, label
, strlen (label
));
683 operator
SQUARE (x
) = x
* x
;
684 boolean operator
NUM_TO_BOOLEAN (x
, string op_name
)
686 if (x
== 0. || x
== 1. || x
== SYSMIS
)
689 if (!ss_is_empty (op_name
))
690 msg (SE
, _("An operand of the %.*s operator was found to have a value "
691 "other than 0 (false), 1 (true), or the system-missing "
692 "value. The result was forced to 0."),
693 (int
) op_name.length
, op_name.string
);
695 msg (SE
, _("A logical expression was found to have a value other than 0 "
696 "(false), 1 (true), or the system-missing value. The result "
697 "was forced to 0."));
701 operator
BOOLEAN_TO_NUM (boolean x
) = x
;
703 // Beta distribution.
704 function PDF.
BETA (x
>= 0 && x
<= 1, a
> 0, b
> 0)
705 = gsl_ran_beta_pdf (x
, a
, b
);
706 function CDF.
BETA (x
>= 0 && x
<= 1, a
> 0, b
> 0) = gsl_cdf_beta_P (x
, a
, b
);
707 function IDF.
BETA (P
>= 0 && P
<= 1, a
> 0, b
> 0)
708 = gsl_cdf_beta_Pinv (P
, a
, b
);
709 no_opt function RV.
BETA (a
> 0, b
> 0) = gsl_ran_beta (get_rng (), a
, b
);
710 function NCDF.
BETA (x
>= 0, a
> 0, b
> 0, lambda
> 0)
711 = ncdf_beta (x
, a
, b
, lambda
);
712 function NPDF.
BETA (x
>= 0, a
> 0, b
> 0, lambda
> 0)
713 = npdf_beta (x
, a
, b
, lambda
);
715 // Bivariate normal distribution.
716 function CDF.
BVNOR (x0
, x1
, r
>= -1 && r
<= 1) = cdf_bvnor (x0
, x1
, r
);
717 function PDF.
BVNOR (x0
, x1
, r
>= -1 && r
<= 1)
718 = gsl_ran_bivariate_gaussian_pdf (x0
, x1
, 1, 1, r
);
720 // Cauchy distribution.
721 function CDF.
CAUCHY (x
, a
, b
> 0) = gsl_cdf_cauchy_P ((x
- a
) / b
, 1);
722 function IDF.
CAUCHY (P
> 0 && P
< 1, a
, b
> 0)
723 = a
+ b
* gsl_cdf_cauchy_Pinv (P
, 1);
724 function PDF.
CAUCHY (x
, a
, b
> 0) = gsl_ran_cauchy_pdf ((x
- a
) / b
, 1) / b
;
725 no_opt function RV.
CAUCHY (a
, b
> 0) = a
+ b
* gsl_ran_cauchy (get_rng (), 1);
727 // Chi
-square distribution.
728 function CDF.
CHISQ (x
>= 0, df
> 0) = gsl_cdf_chisq_P (x
, df
);
729 function IDF.
CHISQ (P
>= 0 && P
< 1, df
> 0) = gsl_cdf_chisq_Pinv (P
, df
);
730 function PDF.
CHISQ (x
>= 0, df
> 0) = gsl_ran_chisq_pdf (x
, df
);
731 no_opt function RV.
CHISQ (df
> 0) = gsl_ran_chisq (get_rng (), df
);
732 function NCDF.
CHISQ (x
>= 0, df
> 0, c
) = unimplemented
;
733 function NPDF.
CHISQ (x
>= 0, df
> 0, c
) = unimplemented
;
734 function SIG.
CHISQ (x
>= 0, df
> 0) = gsl_cdf_chisq_Q (x
, df
);
736 // Exponential distribution.
737 function CDF.
EXP (x
>= 0, a
> 0) = gsl_cdf_exponential_P (x
, 1.
/ a
);
738 function IDF.
EXP (P
>= 0 && P
< 1, a
> 0)
739 = gsl_cdf_exponential_Pinv (P
, 1.
/ a
);
740 function PDF.
EXP (x
>= 0, a
> 0) = gsl_ran_exponential_pdf (x
, 1.
/ a
);
741 no_opt function RV.
EXP (a
> 0) = gsl_ran_exponential (get_rng (), 1.
/ a
);
743 // Exponential power distribution.
744 extension function PDF.
XPOWER (x
, a
> 0, b
>= 0)
745 = gsl_ran_exppow_pdf (x
, a
, b
);
746 no_opt extension function RV.
XPOWER (a
> 0, b
>= 0)
747 = gsl_ran_exppow (get_rng (), a
, b
);
750 function CDF.
F (x
>= 0, df1
> 0, df2
> 0) = gsl_cdf_fdist_P (x
, df1
, df2
);
751 function IDF.
F (P
>= 0 && P
< 1, df1
> 0, df2
> 0) = idf_fdist (P
, df1
, df2
);
752 function PDF.
F (x
>= 0, df1
> 0, df2
> 0) = gsl_ran_fdist_pdf (x
, df1
, df2
);
753 no_opt function RV.
F (df1
> 0, df2
> 0) = gsl_ran_fdist (get_rng (), df1
, df2
);
754 function NCDF.
F (x
>= 0, df1
> 0, df2
> 0, lambda
>= 0) = unimplemented
;
755 function NPDF.
F (x
>= 0, df1
> 0, df2
> 0, lmabda
>= 0) = unimplemented
;
756 function SIG.
F (x
>= 0, df1
> 0, df2
> 0) = gsl_cdf_fdist_Q (x
, df1
, df2
);
758 // Gamma distribution.
759 function CDF.
GAMMA (x
>= 0, a
> 0, b
> 0) = gsl_cdf_gamma_P (x
, a
, 1.
/ b
);
760 function IDF.
GAMMA (P
>= 0 && P
<= 1, a
> 0, b
> 0)
761 = gsl_cdf_gamma_Pinv (P
, a
, 1.
/ b
);
762 function PDF.
GAMMA (x
>= 0, a
> 0, b
> 0) = gsl_ran_gamma_pdf (x
, a
, 1.
/ b
);
763 no_opt function RV.
GAMMA (a
> 0, b
> 0)
764 = gsl_ran_gamma (get_rng (), a
, 1.
/ b
);
766 // Half
-normal distribution.
767 function CDF.
HALFNRM (x
, a
, b
> 0) = unimplemented
;
768 function IDF.
HALFNRM (P
> 0 && P
< 1, a
, b
> 0) = unimplemented
;
769 function PDF.
HALFNRM (x
, a
, b
> 0) = unimplemented
;
770 no_opt function RV.
HALFNRM (a
, b
> 0) = unimplemented
;
772 // Inverse Gaussian distribution.
773 function CDF.
IGAUSS (x
> 0, a
> 0, b
> 0) = unimplemented
;
774 function IDF.
IGAUSS (P
>= 0 && P
< 1, a
> 0, b
> 0) = unimplemented
;
775 function PDF.
IGAUSS (x
> 0, a
> 0, b
> 0) = unimplemented
;
776 no_opt function RV.
IGAUSS (a
> 0, b
> 0) = unimplemented
;
778 // Landau distribution.
779 extension function PDF.
LANDAU (x
) = gsl_ran_landau_pdf (x
);
780 no_opt extension function RV.
LANDAU () = gsl_ran_landau (get_rng ());
782 // Laplace distribution.
783 function CDF.
LAPLACE (x
, a
, b
> 0) = gsl_cdf_laplace_P ((x
- a
) / b
, 1);
784 function IDF.
LAPLACE (P
> 0 && P
< 1, a
, b
> 0)
785 = a
+ b
* gsl_cdf_laplace_Pinv (P
, 1);
786 function PDF.
LAPLACE (x
, a
, b
> 0) = gsl_ran_laplace_pdf ((x
- a
) / b
, 1) / b
;
787 no_opt function RV.
LAPLACE (a
, b
> 0)
788 = a
+ b
* gsl_ran_laplace (get_rng (), 1);
790 // Levy alpha
-stable distribution.
791 no_opt extension function RV.
LEVY (c
, alpha
> 0 && alpha
<= 2)
792 = gsl_ran_levy (get_rng (), c
, alpha
);
794 // Levy skew alpha
-stable distribution.
795 no_opt extension function RV.
LVSKEW (c
, alpha
> 0 && alpha
<= 2,
796 beta
>= -1 && beta
<= 1)
797 = gsl_ran_levy_skew (get_rng (), c
, alpha
, beta
);
799 // Logistic distribution.
800 function CDF.
LOGISTIC (x
, a
, b
> 0) = gsl_cdf_logistic_P ((x
- a
) / b
, 1);
801 function IDF.
LOGISTIC (P
> 0 && P
< 1, a
, b
> 0)
802 = a
+ b
* gsl_cdf_logistic_Pinv (P
, 1);
803 function PDF.
LOGISTIC (x
, a
, b
> 0)
804 = gsl_ran_logistic_pdf ((x
- a
) / b
, 1) / b
;
805 no_opt function RV.
LOGISTIC (a
, b
> 0)
806 = a
+ b
* gsl_ran_logistic (get_rng (), 1);
808 // Lognormal distribution.
809 function CDF.
LNORMAL (x
>= 0, m
> 0, s
> 0)
810 = gsl_cdf_lognormal_P (x
, log (m
), s
);
811 function IDF.
LNORMAL (P
>= 0 && P
< 1, m
> 0, s
> 0)
812 = gsl_cdf_lognormal_Pinv (P
, log (m
), s
);
813 function PDF.
LNORMAL (x
>= 0, m
> 0, s
> 0)
814 = gsl_ran_lognormal_pdf (x
, log (m
), s
);
815 no_opt function RV.
LNORMAL (m
> 0, s
> 0)
816 = gsl_ran_lognormal (get_rng (), log (m
), s
);
818 // Normal distribution.
819 function CDF.
NORMAL (x
, u
, s
> 0) = gsl_cdf_gaussian_P (x
- u
, s
);
820 function IDF.
NORMAL (P
> 0 && P
< 1, u
, s
> 0)
821 = u
+ gsl_cdf_gaussian_Pinv (P
, s
);
822 function PDF.
NORMAL (x
, u
, s
> 0) = gsl_ran_gaussian_pdf ((x
- u
) / s
, 1) / s
;
823 no_opt function RV.
NORMAL (u
, s
> 0) = u
+ gsl_ran_gaussian (get_rng (), s
);
824 function
CDFNORM (x
) = gsl_cdf_ugaussian_P (x
);
825 function
PROBIT (P
> 0 && P
< 1) = gsl_cdf_ugaussian_Pinv (P
);
826 no_opt function
NORMAL (s
> 0) = gsl_ran_gaussian (get_rng (), s
);
828 // Normal tail distribution.
829 function PDF.
NTAIL (x
, a
> 0, sigma
> 0)
830 = gsl_ran_gaussian_tail_pdf (x
, a
, sigma
);
831 no_opt function RV.
NTAIL (a
> 0, sigma
> 0)
832 = gsl_ran_gaussian_tail (get_rng (), a
, sigma
);
834 // Pareto distribution.
835 function CDF.
PARETO (x
>= a
, a
> 0, b
> 0) = gsl_cdf_pareto_P (x
, b
, a
);
836 function IDF.
PARETO (P
>= 0 && P
< 1, a
> 0, b
> 0)
837 = gsl_cdf_pareto_Pinv (P
, b
, a
);
838 function PDF.
PARETO (x
>= a
, a
> 0, b
> 0) = gsl_ran_pareto_pdf (x
, b
, a
);
839 no_opt function RV.
PARETO (a
> 0, b
> 0) = gsl_ran_pareto (get_rng (), b
, a
);
841 // Rayleigh distribution.
842 extension function CDF.
RAYLEIGH (x
, sigma
> 0) = gsl_cdf_rayleigh_P (x
, sigma
);
843 extension function IDF.
RAYLEIGH (P
>= 0 && P
<= 1, sigma
> 0)
844 = gsl_cdf_rayleigh_Pinv (P
, sigma
);
845 extension function PDF.
RAYLEIGH (x
, sigma
> 0)
846 = gsl_ran_rayleigh_pdf (x
, sigma
);
847 no_opt extension function RV.
RAYLEIGH (sigma
> 0)
848 = gsl_ran_rayleigh (get_rng (), sigma
);
850 // Rayleigh tail distribution.
851 extension function PDF.
RTAIL (x
, a
, sigma
)
852 = gsl_ran_rayleigh_tail_pdf (x
, a
, sigma
);
853 no_opt extension function RV.
RTAIL (a
, sigma
)
854 = gsl_ran_rayleigh_tail (get_rng (), a
, sigma
);
856 // Studentized maximum modulus distribution.
857 function CDF.
SMOD (x
> 0, a
>= 1, b
>= 1) = unimplemented
;
858 function IDF.
SMOD (P
>= 0 && P
< 1, a
>= 1, b
>= 1) = unimplemented
;
860 // Studentized range distribution.
861 function CDF.
SRANGE (x
> 0, a
>= 1, b
>= 1) = unimplemented
;
862 function IDF.
SRANGE (P
>= 0 && P
< 1, a
>= 1, b
>= 1) = unimplemented
;
864 // Student t distribution.
865 function CDF.
T (x
, df
> 0) = gsl_cdf_tdist_P (x
, df
);
866 function IDF.
T (P
> 0 && P
< 1, df
> 0) = gsl_cdf_tdist_Pinv (P
, df
);
867 function PDF.
T (x
, df
> 0) = gsl_ran_tdist_pdf (x
, df
);
868 no_opt function RV.
T (df
> 0) = gsl_ran_tdist (get_rng (), df
);
869 function NCDF.
T (x
, df
> 0, nc
) = unimplemented
;
870 function NPDF.
T (x
, df
> 0, nc
) = unimplemented
;
872 // Type
-1 Gumbel distribution.
873 extension function CDF.
T1G (x
, a
, b
) = gsl_cdf_gumbel1_P (x
, a
, b
);
874 extension function IDF.
T1G (P
>= 0 && P
<= 1, a
, b
)
875 = gsl_cdf_gumbel1_Pinv (P
, a
, b
);
876 extension function PDF.
T1G (x
, a
, b
) = gsl_ran_gumbel1_pdf (x
, a
, b
);
877 no_opt extension function RV.
T1G (a
, b
) = gsl_ran_gumbel1 (get_rng (), a
, b
);
879 // Type
-2 Gumbel distribution.
880 extension function CDF.
T2G (x
, a
, b
) = gsl_cdf_gumbel2_P (x
, a
, b
);
881 extension function IDF.
T2G (P
>= 0 && P
<= 1, a
, b
)
882 = gsl_cdf_gumbel2_Pinv (P
, a
, b
);
883 extension function PDF.
T2G (x
, a
, b
) = gsl_ran_gumbel2_pdf (x
, a
, b
);
884 no_opt extension function RV.
T2G (a
, b
) = gsl_ran_gumbel2 (get_rng (), a
, b
);
886 // Uniform distribution.
887 function CDF.
UNIFORM (x
<= b
, a
<= x
, b
) = gsl_cdf_flat_P (x
, a
, b
);
888 function IDF.
UNIFORM (P
>= 0 && P
<= 1, a
<= b
, b
)
889 = gsl_cdf_flat_Pinv (P
, a
, b
);
890 function PDF.
UNIFORM (x
<= b
, a
<= x
, b
) = gsl_ran_flat_pdf (x
, a
, b
);
891 no_opt function RV.
UNIFORM (a
<= b
, b
) = gsl_ran_flat (get_rng (), a
, b
);
892 no_opt function
UNIFORM (b
>= 0) = gsl_ran_flat (get_rng (), 0, b
);
894 // Weibull distribution.
895 function CDF.
WEIBULL (x
>= 0, a
> 0, b
> 0) = gsl_cdf_weibull_P (x
, a
, b
);
896 function IDF.
WEIBULL (P
>= 0 && P
< 1, a
> 0, b
> 0)
897 = gsl_cdf_weibull_Pinv (P
, a
, b
);
898 function PDF.
WEIBULL (x
>= 0, a
> 0, b
> 0) = gsl_ran_weibull_pdf (x
, a
, b
);
899 no_opt function RV.
WEIBULL (a
> 0, b
> 0) = gsl_ran_weibull (get_rng (), a
, b
);
901 // Bernoulli distribution.
902 function CDF.
BERNOULLI (k
== 0 || k
== 1, p
>= 0 && p
<= 1)
904 function PDF.
BERNOULLI (k
== 0 || k
== 1, p
>= 0 && p
<= 1)
905 = gsl_ran_bernoulli_pdf (k
, p
);
906 no_opt function RV.
BERNOULLI (p
>= 0 && p
<= 1)
907 = gsl_ran_bernoulli (get_rng (), p
);
909 // Binomial distribution.
910 function CDF.
BINOM (k
, n
> 0 && n
== floor (n
), p
>= 0 && p
<= 1)
911 = gsl_cdf_binomial_P (k
, p
, n
);
912 function PDF.
BINOM (k
>= 0 && k
== floor (k
) && k
<= n
,
913 n
> 0 && n
== floor (n
),
915 = gsl_ran_binomial_pdf (k
, p
, n
);
916 no_opt function RV.
BINOM (p
> 0 && p
== floor (p
), n
>= 0 && n
<= 1)
917 = gsl_ran_binomial (get_rng (), p
, n
);
919 // Geometric distribution.
920 function CDF.
GEOM (k
>= 1 && k
== floor (k
), p
>= 0 && p
<= 1)
921 = gsl_cdf_geometric_P (k
, p
);
922 function PDF.
GEOM (k
>= 1 && k
== floor (k
),
924 = gsl_ran_geometric_pdf (k
, p
);
925 no_opt function RV.
GEOM (p
>= 0 && p
<= 1) = gsl_ran_geometric (get_rng (), p
);
927 // Hypergeometric distribution.
928 function CDF.
HYPER (k
>= 0 && k
== floor (k
) && k
<= c
,
929 a
> 0 && a
== floor (a
),
930 b
> 0 && b
== floor (b
) && b
<= a
,
931 c
> 0 && c
== floor (c
) && c
<= a
)
932 = gsl_cdf_hypergeometric_P (k
, c
, a
- c
, b
);
933 function PDF.
HYPER (k
>= 0 && k
== floor (k
) && k
<= c
,
934 a
> 0 && a
== floor (a
),
935 b
> 0 && b
== floor (b
) && b
<= a
,
936 c
> 0 && c
== floor (c
) && c
<= a
)
937 = gsl_ran_hypergeometric_pdf (k
, c
, a
- c
, b
);
938 no_opt function RV.
HYPER (a
> 0 && a
== floor (a
),
939 b
> 0 && b
== floor (b
) && b
<= a
,
940 c
> 0 && c
== floor (c
) && c
<= a
)
941 = gsl_ran_hypergeometric (get_rng (), c
, a
- c
, b
);
943 // Logarithmic distribution.
944 extension function PDF.
LOG (k
>= 1, p
> 0 && p
<= 1)
945 = gsl_ran_logarithmic_pdf (k
, p
);
946 no_opt extension function RV.
LOG (p
> 0 && p
<= 1)
947 = gsl_ran_logarithmic (get_rng (), p
);
949 // Negative binomial distribution.
950 function CDF.
NEGBIN (k
>= 1, n
== floor (n
), p
> 0 && p
<= 1)
951 = gsl_cdf_negative_binomial_P (k
, p
, n
);
952 function PDF.
NEGBIN (k
>= 1, n
== floor (n
), p
> 0 && p
<= 1)
953 = gsl_ran_negative_binomial_pdf (k
, p
, n
);
954 no_opt function RV.
NEGBIN (n
== floor (n
), p
> 0 && p
<= 1)
955 = gsl_ran_negative_binomial (get_rng (), p
, n
);
957 // Poisson distribution.
958 function CDF.
POISSON (k
>= 0 && k
== floor (k
), mu
> 0)
959 = gsl_cdf_poisson_P (k
, mu
);
960 function PDF.
POISSON (k
>= 0 && k
== floor (k
), mu
> 0)
961 = gsl_ran_poisson_pdf (k
, mu
);
962 no_opt function RV.
POISSON (mu
> 0) = gsl_ran_poisson (get_rng (), mu
);
965 absorb_miss boolean function
MISSING (x
) = x
== SYSMIS ||
!isfinite (x
);
966 absorb_miss boolean function
SYSMIS (x
) = x
== SYSMIS ||
!isfinite (x
);
967 no_opt boolean function
SYSMIS (num_var v
)
970 return
case_num (c
, v
) == SYSMIS
;
972 no_opt boolean function
VALUE (num_var v
)
975 return
case_num (c
, v
);
978 no_opt operator
VEC_ELEM_NUM (idx
)
982 if (idx
>= 1 && idx
<= vector_get_var_cnt (v
))
984 const struct variable
*var
= vector_get_var (v
, (size_t
) idx
- 1);
985 double value
= case_num (c
, var
);
986 return
!var_is_num_missing (var
, value
, MV_USER
) ? value
: SYSMIS
;
991 msg (SE
, _("SYSMIS is not a valid index value for vector "
992 "%s. The result will be set to SYSMIS."),
993 vector_get_name (v
));
995 msg (SE
, _("%g is not a valid index value for vector %s. "
996 "The result will be set to SYSMIS."),
997 idx
, vector_get_name (v
));
1002 absorb_miss no_opt string operator
VEC_ELEM_STR (idx
)
1007 if (idx
>= 1 && idx
<= vector_get_var_cnt (v
))
1009 struct variable
*var
= vector_get_var (v
, (size_t
) idx
- 1);
1010 return
copy_string (e
, CHAR_CAST_BUG (char
*, case_str (c
, var
)),
1011 var_get_width (var
));
1016 msg (SE
, _("SYSMIS is not a valid index value for vector "
1017 "%s. The result will be set to the empty string."),
1018 vector_get_name (v
));
1020 msg (SE
, _("%g is not a valid index value for vector %s. "
1021 "The result will be set to the empty string."),
1022 idx
, vector_get_name (v
));
1023 return empty_string
;
1029 no_opt operator
NUM_VAR ()
1033 double d
= case_num (c
, v
);
1034 return
!var_is_num_missing (v
, d
, MV_USER
) ? d
: SYSMIS
;
1037 no_opt string operator
STR_VAR ()
1042 struct substring s
= alloc_string (e
, var_get_width (v
));
1043 memcpy (s.string
, case_str (c
, v
), var_get_width (v
));
1047 no_opt perm_only function
LAG (num_var v
, pos_int n_before
)
1050 const struct ccase
*c
= lagged_case (ds
, n_before
);
1053 double x
= case_num (c
, v
);
1054 return
!var_is_num_missing (v
, x
, MV_USER
) ? x
: SYSMIS
;
1060 no_opt perm_only function
LAG (num_var v
)
1063 const struct ccase
*c
= lagged_case (ds
, 1);
1066 double x
= case_num (c
, v
);
1067 return
!var_is_num_missing (v
, x
, MV_USER
) ? x
: SYSMIS
;
1073 no_opt perm_only string function
LAG (str_var v
, pos_int n_before
)
1077 const struct ccase
*c
= lagged_case (ds
, n_before
);
1079 return
copy_string (e
, CHAR_CAST_BUG (char
*, case_str (c
, v
)),
1082 return empty_string
;
1085 no_opt perm_only string function
LAG (str_var v
)
1089 const struct ccase
*c
= lagged_case (ds
, 1);
1091 return
copy_string (e
, CHAR_CAST_BUG (char
*, case_str (c
, v
)),
1094 return empty_string
;
1097 no_opt operator
NUM_SYS ()
1101 return
case_num (c
, v
) == SYSMIS
;
1104 no_opt operator
NUM_VAL ()
1108 return
case_num (c
, v
);
1111 no_opt operator
CASENUM ()