1 /*
2 * Copyright 2003-2005 The Apache Software Foundation.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.apache.commons.math.distribution;
18
19 import org.apache.commons.discovery.tools.DiscoverClass;
20
21 /**
22 * This factory provids the means to create common statistical distributions.
23 * The following distributions are supported:
24 * <ul>
25 * <li>Binomial</li>
26 * <li>Cauchy</li>
27 * <li>Chi-Squared</li>
28 * <li>Exponential</li>
29 * <li>F</li>
30 * <li>Gamma</li>
31 * <li>HyperGeometric</li>
32 * <li>Poisson</li>
33 * <li>Normal</li>
34 * <li>Student's t</li>
35 * <li>Weibull</li>
36 * </ul>
37 *
38 * Common usage:<pre>
39 * DistributionFactory factory = DistributionFactory.newInstance();
40 *
41 * // create a Chi-Square distribution with 5 degrees of freedom.
42 * ChiSquaredDistribution chi = factory.createChiSquareDistribution(5.0);
43 * </pre>
44 *
45 * @version $Revision: 201915 $ $Date: 2005-06-26 15:20:57 -0700 (Sun, 26 Jun 2005) $
46 */
47 public abstract class DistributionFactory {
48 /**
49 * Default constructor.
50 */
51 protected DistributionFactory() {
52 super();
53 }
54
55 /**
56 * Create an instance of a <code>DistributionFactory</code>
57 * @return a new factory.
58 */
59 public static DistributionFactory newInstance() {
60 DistributionFactory factory = null;
61 try {
62 DiscoverClass dc = new DiscoverClass();
63 factory = (DistributionFactory) dc.newInstance(
64 DistributionFactory.class,
65 "org.apache.commons.math.distribution.DistributionFactoryImpl");
66 } catch(Throwable t) {
67 return new DistributionFactoryImpl();
68 }
69 return factory;
70 }
71
72 /**
73 * Create a binomial distribution with the given number of trials and
74 * probability of success.
75 *
76 * @param numberOfTrials the number of trials.
77 * @param probabilityOfSuccess the probability of success
78 * @return a new binomial distribution
79 */
80 public abstract BinomialDistribution createBinomialDistribution(
81 int numberOfTrials, double probabilityOfSuccess);
82
83 /**
84 * Create a new cauchy distribution with the given median and scale.
85 * @param median the median of the distribution
86 * @param scale the scale
87 * @return a new cauchy distribution
88 * @since 1.1
89 */
90 public CauchyDistribution createCauchyDistribution(
91 double median, double scale)
92 {
93 return new CauchyDistributionImpl(median, scale);
94 }
95
96 /**
97 * Create a new chi-square distribution with the given degrees of freedom.
98 *
99 * @param degreesOfFreedom degrees of freedom
100 * @return a new chi-square distribution
101 */
102 public abstract ChiSquaredDistribution createChiSquareDistribution(
103 double degreesOfFreedom);
104
105 /**
106 * Create a new exponential distribution with the given degrees of freedom.
107 *
108 * @param mean mean
109 * @return a new exponential distribution
110 */
111 public abstract ExponentialDistribution createExponentialDistribution(
112 double mean);
113
114 /**
115 * Create a new F-distribution with the given degrees of freedom.
116 *
117 * @param numeratorDegreesOfFreedom numerator degrees of freedom
118 * @param denominatorDegreesOfFreedom denominator degrees of freedom
119 * @return a new F-distribution
120 */
121 public abstract FDistribution createFDistribution(
122 double numeratorDegreesOfFreedom, double denominatorDegreesOfFreedom);
123
124 /**
125 * Create a new gamma distribution with the given shape and scale
126 * parameters.
127 *
128 * @param alpha the shape parameter
129 * @param beta the scale parameter
130 *
131 * @return a new gamma distribution
132 */
133 public abstract GammaDistribution createGammaDistribution(
134 double alpha, double beta);
135
136 /**
137 * Create a new t distribution with the given degrees of freedom.
138 *
139 * @param degreesOfFreedom degrees of freedom
140 * @return a new t distribution
141 */
142 public abstract TDistribution createTDistribution(double degreesOfFreedom);
143
144 /**
145 * Create a new hypergeometric distribution with the given the population
146 * size, the number of successes in the population, and the sample size.
147 *
148 * @param populationSize the population size
149 * @param numberOfSuccesses number of successes in the population
150 * @param sampleSize the sample size
151 * @return a new hypergeometric desitribution
152 */
153 public abstract HypergeometricDistribution
154 createHypergeometricDistribution(int populationSize,
155 int numberOfSuccesses, int sampleSize);
156
157 /**
158 * Create a new normal distribution with the given mean and standard
159 * deviation.
160 *
161 * @param mean the mean of the distribution
162 * @param sd standard deviation
163 * @return a new normal distribution
164 */
165 public abstract NormalDistribution
166 createNormalDistribution(double mean, double sd);
167
168 /**
169 * Create a new normal distribution with mean zero and standard
170 * deviation one.
171 *
172 * @return a new normal distribution.
173 */
174 public abstract NormalDistribution createNormalDistribution();
175
176 /**
177 * Create a new Poisson distribution with poisson parameter lambda.
178 *
179 * @param lambda poisson parameter
180 * @return a new poisson distribution.
181 */
182 public abstract PoissonDistribution
183 createPoissonDistribution(double lambda);
184
185 /**
186 * Create a new Weibull distribution with the given shape and scale
187 * parameters.
188 *
189 * @param alpha the shape parameter.
190 * @param beta the scale parameter.
191 * @return a new Weibull distribution.
192 * @since 1.1
193 */
194 public WeibullDistribution createWeibullDistribution(
195 double alpha, double beta)
196 {
197 return new WeibullDistributionImpl(alpha, beta);
198 }
199 }