Added script front-end for primer-design code
[htsworkflow.git] / htswanalysis / MACS / lib / gsl / gsl-1.11 / randist / gausstail.c
1 /* randist/gausstail.c
2  * 
3  * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 James Theiler, Brian Gough
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 3 of the License, or (at
8  * your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * 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, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19
20 #include <config.h>
21 #include <math.h>
22 #include <gsl/gsl_math.h>
23 #include <gsl/gsl_rng.h>
24 #include <gsl/gsl_randist.h>
25 #include <gsl/gsl_sf_erf.h>
26
27 double
28 gsl_ran_gaussian_tail (const gsl_rng * r, const double a, const double sigma)
29 {
30   /* Returns a gaussian random variable larger than a
31    * This implementation does one-sided upper-tailed deviates.
32    */
33
34   double s = a / sigma;
35
36   if (s < 1)
37     {
38       /* For small s, use a direct rejection method. The limit s < 1
39          can be adjusted to optimise the overall efficiency */
40
41       double x;
42
43       do
44         {
45           x = gsl_ran_gaussian (r, 1.0);
46         }
47       while (x < s);
48       return x * sigma;
49     }
50   else
51     {
52       /* Use the "supertail" deviates from the last two steps
53        * of Marsaglia's rectangle-wedge-tail method, as described
54        * in Knuth, v2, 3rd ed, pp 123-128.  (See also exercise 11, p139,
55        * and the solution, p586.)
56        */
57
58       double u, v, x;
59
60       do
61         {
62           u = gsl_rng_uniform (r);
63           do
64             {
65               v = gsl_rng_uniform (r);
66             }
67           while (v == 0.0);
68           x = sqrt (s * s - 2 * log (v));
69         }
70       while (x * u > s);
71       return x * sigma;
72     }
73 }
74
75 double
76 gsl_ran_gaussian_tail_pdf (const double x, const double a, const double sigma)
77 {
78   if (x < a)
79     {
80       return 0;
81     }
82   else
83     {
84       double N, p;
85       double u = x / sigma ;
86
87       double f = gsl_sf_erfc (a / (sqrt (2.0) * sigma));
88
89       N = 0.5 * f;
90
91       p = (1 / (N * sqrt (2 * M_PI) * sigma)) * exp (-u * u / 2);
92
93       return p;
94     }
95 }
96
97 double
98 gsl_ran_ugaussian_tail (const gsl_rng * r, const double a)
99 {
100   return gsl_ran_gaussian_tail (r, a, 1.0) ;
101 }
102
103 double
104 gsl_ran_ugaussian_tail_pdf (const double x, const double a)
105 {
106   return gsl_ran_gaussian_tail_pdf (x, a, 1.0) ;
107 }