View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  /*
19   * This is not the original file distributed by the Apache Software Foundation
20   * It has been modified by the Hipparchus project
21   */
22  package org.hipparchus.distribution;
23  
24  import org.hipparchus.exception.MathIllegalArgumentException;
25  
26  /**
27   * Base interface for continuous distributions.
28   */
29  public interface RealDistribution {
30  
31      /**
32       * For a random variable {@code X} whose values are distributed according
33       * to this distribution, this method returns {@code P(x0 < X <= x1)}.
34       *
35       * @param x0 the exclusive lower bound
36       * @param x1 the inclusive upper bound
37       * @return the probability that a random variable with this distribution
38       * takes a value between {@code x0} and {@code x1},
39       * excluding the lower and including the upper endpoint
40       * @throws MathIllegalArgumentException if {@code x0 > x1}
41       */
42      double probability(double x0, double x1) throws MathIllegalArgumentException;
43  
44      /**
45       * Returns the probability density function (PDF) of this distribution
46       * evaluated at the specified point {@code x}. In general, the PDF is
47       * the derivative of the {@link #cumulativeProbability(double) CDF}.
48       * If the derivative does not exist at {@code x}, then an appropriate
49       * replacement should be returned, e.g. {@code Double.POSITIVE_INFINITY},
50       * {@code Double.NaN}, or  the limit inferior or limit superior of the
51       * difference quotient.
52       *
53       * @param x the point at which the PDF is evaluated
54       * @return the value of the probability density function at point {@code x}
55       */
56      double density(double x);
57  
58      /**
59       * Returns the natural logarithm of the probability density function
60       * (PDF) of this distribution evaluated at the specified point {@code x}.
61       * In general, the PDF is the derivative of the {@link #cumulativeProbability(double) CDF}.
62       * If the derivative does not exist at {@code x}, then an appropriate replacement
63       * should be returned, e.g. {@code Double.POSITIVE_INFINITY}, {@code Double.NaN},
64       * or the limit inferior or limit superior of the difference quotient. Note that
65       * due to the floating point precision and under/overflow issues, this method will
66       * for some distributions be more precise and faster than computing the logarithm of
67       * {@link #density(double)}.
68       *
69       * @param x the point at which the PDF is evaluated
70       * @return the logarithm of the value of the probability density function at point {@code x}
71       */
72      double logDensity(double x);
73  
74      /**
75       * For a random variable {@code X} whose values are distributed according
76       * to this distribution, this method returns {@code P(X <= x)}. In other
77       * words, this method represents the (cumulative) distribution function
78       * (CDF) for this distribution.
79       *
80       * @param x the point at which the CDF is evaluated
81       * @return the probability that a random variable with this
82       * distribution takes a value less than or equal to {@code x}
83       */
84      double cumulativeProbability(double x);
85  
86      /**
87       * Computes the quantile function of this distribution. For a random
88       * variable {@code X} distributed according to this distribution, the
89       * returned value is
90       * <ul>
91       * <li><code>inf{x in R | P(X&lt;=x) &gt;= p}</code> for {@code 0 < p <= 1},</li>
92       * <li><code>inf{x in R | P(X&lt;=x) &gt; 0}</code> for {@code p = 0}.</li>
93       * </ul>
94       *
95       * @param p the cumulative probability
96       * @return the smallest {@code p}-quantile of this distribution
97       * (largest 0-quantile for {@code p = 0})
98       * @throws MathIllegalArgumentException if {@code p < 0} or {@code p > 1}
99       */
100     double inverseCumulativeProbability(double p) throws MathIllegalArgumentException;
101 
102     /**
103      * Use this method to get the numerical value of the mean of this
104      * distribution.
105      *
106      * @return the mean or {@code Double.NaN} if it is not defined
107      */
108     double getNumericalMean();
109 
110     /**
111      * Use this method to get the numerical value of the variance of this
112      * distribution.
113      *
114      * @return the variance (possibly {@code Double.POSITIVE_INFINITY} as
115      * for certain cases in {@link org.hipparchus.distribution.continuous.TDistribution})
116      * or {@code Double.NaN} if it is not defined
117      */
118     double getNumericalVariance();
119 
120     /**
121      * Access the lower bound of the support. This method must return the same
122      * value as {@code inverseCumulativeProbability(0)}. In other words, this
123      * method must return
124      * <p><code>inf {x in R | P(X &lt;= x) &gt; 0}</code>.</p>
125      *
126      * @return lower bound of the support (might be
127      * {@code Double.NEGATIVE_INFINITY})
128      */
129     double getSupportLowerBound();
130 
131     /**
132      * Access the upper bound of the support. This method must return the same
133      * value as {@code inverseCumulativeProbability(1)}. In other words, this
134      * method must return
135      * <p><code>inf {x in R | P(X &lt;= x) = 1}</code>.</p>
136      *
137      * @return upper bound of the support (might be
138      * {@code Double.POSITIVE_INFINITY})
139      */
140     double getSupportUpperBound();
141 
142     /**
143      * Use this method to get information about whether the support is connected,
144      * i.e. whether all values between the lower and upper bound of the support
145      * are included in the support.
146      *
147      * @return whether the support is connected or not
148      */
149     boolean isSupportConnected();
150 
151 }