comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/distribution/HypergeometricDistributionImpl.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.distribution;<a name="line.18"></a>
22 <FONT color="green">019</FONT> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.io.Serializable;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.util.MathUtils;<a name="line.23"></a>
27 <FONT color="green">024</FONT> <a name="line.24"></a>
28 <FONT color="green">025</FONT> /**<a name="line.25"></a>
29 <FONT color="green">026</FONT> * The default implementation of {@link HypergeometricDistribution}.<a name="line.26"></a>
30 <FONT color="green">027</FONT> *<a name="line.27"></a>
31 <FONT color="green">028</FONT> * @version $Revision: 920852 $ $Date: 2010-03-09 07:53:44 -0500 (Tue, 09 Mar 2010) $<a name="line.28"></a>
32 <FONT color="green">029</FONT> */<a name="line.29"></a>
33 <FONT color="green">030</FONT> public class HypergeometricDistributionImpl extends AbstractIntegerDistribution<a name="line.30"></a>
34 <FONT color="green">031</FONT> implements HypergeometricDistribution, Serializable {<a name="line.31"></a>
35 <FONT color="green">032</FONT> <a name="line.32"></a>
36 <FONT color="green">033</FONT> /** Serializable version identifier */<a name="line.33"></a>
37 <FONT color="green">034</FONT> private static final long serialVersionUID = -436928820673516179L;<a name="line.34"></a>
38 <FONT color="green">035</FONT> <a name="line.35"></a>
39 <FONT color="green">036</FONT> /** The number of successes in the population. */<a name="line.36"></a>
40 <FONT color="green">037</FONT> private int numberOfSuccesses;<a name="line.37"></a>
41 <FONT color="green">038</FONT> <a name="line.38"></a>
42 <FONT color="green">039</FONT> /** The population size. */<a name="line.39"></a>
43 <FONT color="green">040</FONT> private int populationSize;<a name="line.40"></a>
44 <FONT color="green">041</FONT> <a name="line.41"></a>
45 <FONT color="green">042</FONT> /** The sample size. */<a name="line.42"></a>
46 <FONT color="green">043</FONT> private int sampleSize;<a name="line.43"></a>
47 <FONT color="green">044</FONT> <a name="line.44"></a>
48 <FONT color="green">045</FONT> /**<a name="line.45"></a>
49 <FONT color="green">046</FONT> * Construct a new hypergeometric distribution with the given the population<a name="line.46"></a>
50 <FONT color="green">047</FONT> * size, the number of successes in the population, and the sample size.<a name="line.47"></a>
51 <FONT color="green">048</FONT> *<a name="line.48"></a>
52 <FONT color="green">049</FONT> * @param populationSize the population size.<a name="line.49"></a>
53 <FONT color="green">050</FONT> * @param numberOfSuccesses number of successes in the population.<a name="line.50"></a>
54 <FONT color="green">051</FONT> * @param sampleSize the sample size.<a name="line.51"></a>
55 <FONT color="green">052</FONT> */<a name="line.52"></a>
56 <FONT color="green">053</FONT> public HypergeometricDistributionImpl(int populationSize,<a name="line.53"></a>
57 <FONT color="green">054</FONT> int numberOfSuccesses, int sampleSize) {<a name="line.54"></a>
58 <FONT color="green">055</FONT> super();<a name="line.55"></a>
59 <FONT color="green">056</FONT> if (numberOfSuccesses &gt; populationSize) {<a name="line.56"></a>
60 <FONT color="green">057</FONT> throw MathRuntimeException<a name="line.57"></a>
61 <FONT color="green">058</FONT> .createIllegalArgumentException(<a name="line.58"></a>
62 <FONT color="green">059</FONT> "number of successes ({0}) must be less than or equal to population size ({1})",<a name="line.59"></a>
63 <FONT color="green">060</FONT> numberOfSuccesses, populationSize);<a name="line.60"></a>
64 <FONT color="green">061</FONT> }<a name="line.61"></a>
65 <FONT color="green">062</FONT> if (sampleSize &gt; populationSize) {<a name="line.62"></a>
66 <FONT color="green">063</FONT> throw MathRuntimeException<a name="line.63"></a>
67 <FONT color="green">064</FONT> .createIllegalArgumentException(<a name="line.64"></a>
68 <FONT color="green">065</FONT> "sample size ({0}) must be less than or equal to population size ({1})",<a name="line.65"></a>
69 <FONT color="green">066</FONT> sampleSize, populationSize);<a name="line.66"></a>
70 <FONT color="green">067</FONT> }<a name="line.67"></a>
71 <FONT color="green">068</FONT> <a name="line.68"></a>
72 <FONT color="green">069</FONT> setPopulationSizeInternal(populationSize);<a name="line.69"></a>
73 <FONT color="green">070</FONT> setSampleSizeInternal(sampleSize);<a name="line.70"></a>
74 <FONT color="green">071</FONT> setNumberOfSuccessesInternal(numberOfSuccesses);<a name="line.71"></a>
75 <FONT color="green">072</FONT> }<a name="line.72"></a>
76 <FONT color="green">073</FONT> <a name="line.73"></a>
77 <FONT color="green">074</FONT> /**<a name="line.74"></a>
78 <FONT color="green">075</FONT> * For this distribution, X, this method returns P(X &amp;le; x).<a name="line.75"></a>
79 <FONT color="green">076</FONT> *<a name="line.76"></a>
80 <FONT color="green">077</FONT> * @param x the value at which the PDF is evaluated.<a name="line.77"></a>
81 <FONT color="green">078</FONT> * @return PDF for this distribution.<a name="line.78"></a>
82 <FONT color="green">079</FONT> */<a name="line.79"></a>
83 <FONT color="green">080</FONT> @Override<a name="line.80"></a>
84 <FONT color="green">081</FONT> public double cumulativeProbability(int x) {<a name="line.81"></a>
85 <FONT color="green">082</FONT> double ret;<a name="line.82"></a>
86 <FONT color="green">083</FONT> <a name="line.83"></a>
87 <FONT color="green">084</FONT> int[] domain = getDomain(populationSize, numberOfSuccesses, sampleSize);<a name="line.84"></a>
88 <FONT color="green">085</FONT> if (x &lt; domain[0]) {<a name="line.85"></a>
89 <FONT color="green">086</FONT> ret = 0.0;<a name="line.86"></a>
90 <FONT color="green">087</FONT> } else if (x &gt;= domain[1]) {<a name="line.87"></a>
91 <FONT color="green">088</FONT> ret = 1.0;<a name="line.88"></a>
92 <FONT color="green">089</FONT> } else {<a name="line.89"></a>
93 <FONT color="green">090</FONT> ret = innerCumulativeProbability(domain[0], x, 1, populationSize,<a name="line.90"></a>
94 <FONT color="green">091</FONT> numberOfSuccesses, sampleSize);<a name="line.91"></a>
95 <FONT color="green">092</FONT> }<a name="line.92"></a>
96 <FONT color="green">093</FONT> <a name="line.93"></a>
97 <FONT color="green">094</FONT> return ret;<a name="line.94"></a>
98 <FONT color="green">095</FONT> }<a name="line.95"></a>
99 <FONT color="green">096</FONT> <a name="line.96"></a>
100 <FONT color="green">097</FONT> /**<a name="line.97"></a>
101 <FONT color="green">098</FONT> * Return the domain for the given hypergeometric distribution parameters.<a name="line.98"></a>
102 <FONT color="green">099</FONT> *<a name="line.99"></a>
103 <FONT color="green">100</FONT> * @param n the population size.<a name="line.100"></a>
104 <FONT color="green">101</FONT> * @param m number of successes in the population.<a name="line.101"></a>
105 <FONT color="green">102</FONT> * @param k the sample size.<a name="line.102"></a>
106 <FONT color="green">103</FONT> * @return a two element array containing the lower and upper bounds of the<a name="line.103"></a>
107 <FONT color="green">104</FONT> * hypergeometric distribution.<a name="line.104"></a>
108 <FONT color="green">105</FONT> */<a name="line.105"></a>
109 <FONT color="green">106</FONT> private int[] getDomain(int n, int m, int k) {<a name="line.106"></a>
110 <FONT color="green">107</FONT> return new int[] { getLowerDomain(n, m, k), getUpperDomain(m, k) };<a name="line.107"></a>
111 <FONT color="green">108</FONT> }<a name="line.108"></a>
112 <FONT color="green">109</FONT> <a name="line.109"></a>
113 <FONT color="green">110</FONT> /**<a name="line.110"></a>
114 <FONT color="green">111</FONT> * Access the domain value lower bound, based on &lt;code&gt;p&lt;/code&gt;, used to<a name="line.111"></a>
115 <FONT color="green">112</FONT> * bracket a PDF root.<a name="line.112"></a>
116 <FONT color="green">113</FONT> *<a name="line.113"></a>
117 <FONT color="green">114</FONT> * @param p the desired probability for the critical value<a name="line.114"></a>
118 <FONT color="green">115</FONT> * @return domain value lower bound, i.e. P(X &amp;lt; &lt;i&gt;lower bound&lt;/i&gt;) &amp;lt;<a name="line.115"></a>
119 <FONT color="green">116</FONT> * &lt;code&gt;p&lt;/code&gt;<a name="line.116"></a>
120 <FONT color="green">117</FONT> */<a name="line.117"></a>
121 <FONT color="green">118</FONT> @Override<a name="line.118"></a>
122 <FONT color="green">119</FONT> protected int getDomainLowerBound(double p) {<a name="line.119"></a>
123 <FONT color="green">120</FONT> return getLowerDomain(populationSize, numberOfSuccesses, sampleSize);<a name="line.120"></a>
124 <FONT color="green">121</FONT> }<a name="line.121"></a>
125 <FONT color="green">122</FONT> <a name="line.122"></a>
126 <FONT color="green">123</FONT> /**<a name="line.123"></a>
127 <FONT color="green">124</FONT> * Access the domain value upper bound, based on &lt;code&gt;p&lt;/code&gt;, used to<a name="line.124"></a>
128 <FONT color="green">125</FONT> * bracket a PDF root.<a name="line.125"></a>
129 <FONT color="green">126</FONT> *<a name="line.126"></a>
130 <FONT color="green">127</FONT> * @param p the desired probability for the critical value<a name="line.127"></a>
131 <FONT color="green">128</FONT> * @return domain value upper bound, i.e. P(X &amp;lt; &lt;i&gt;upper bound&lt;/i&gt;) &amp;gt;<a name="line.128"></a>
132 <FONT color="green">129</FONT> * &lt;code&gt;p&lt;/code&gt;<a name="line.129"></a>
133 <FONT color="green">130</FONT> */<a name="line.130"></a>
134 <FONT color="green">131</FONT> @Override<a name="line.131"></a>
135 <FONT color="green">132</FONT> protected int getDomainUpperBound(double p) {<a name="line.132"></a>
136 <FONT color="green">133</FONT> return getUpperDomain(sampleSize, numberOfSuccesses);<a name="line.133"></a>
137 <FONT color="green">134</FONT> }<a name="line.134"></a>
138 <FONT color="green">135</FONT> <a name="line.135"></a>
139 <FONT color="green">136</FONT> /**<a name="line.136"></a>
140 <FONT color="green">137</FONT> * Return the lowest domain value for the given hypergeometric distribution<a name="line.137"></a>
141 <FONT color="green">138</FONT> * parameters.<a name="line.138"></a>
142 <FONT color="green">139</FONT> *<a name="line.139"></a>
143 <FONT color="green">140</FONT> * @param n the population size.<a name="line.140"></a>
144 <FONT color="green">141</FONT> * @param m number of successes in the population.<a name="line.141"></a>
145 <FONT color="green">142</FONT> * @param k the sample size.<a name="line.142"></a>
146 <FONT color="green">143</FONT> * @return the lowest domain value of the hypergeometric distribution.<a name="line.143"></a>
147 <FONT color="green">144</FONT> */<a name="line.144"></a>
148 <FONT color="green">145</FONT> private int getLowerDomain(int n, int m, int k) {<a name="line.145"></a>
149 <FONT color="green">146</FONT> return Math.max(0, m - (n - k));<a name="line.146"></a>
150 <FONT color="green">147</FONT> }<a name="line.147"></a>
151 <FONT color="green">148</FONT> <a name="line.148"></a>
152 <FONT color="green">149</FONT> /**<a name="line.149"></a>
153 <FONT color="green">150</FONT> * Access the number of successes.<a name="line.150"></a>
154 <FONT color="green">151</FONT> *<a name="line.151"></a>
155 <FONT color="green">152</FONT> * @return the number of successes.<a name="line.152"></a>
156 <FONT color="green">153</FONT> */<a name="line.153"></a>
157 <FONT color="green">154</FONT> public int getNumberOfSuccesses() {<a name="line.154"></a>
158 <FONT color="green">155</FONT> return numberOfSuccesses;<a name="line.155"></a>
159 <FONT color="green">156</FONT> }<a name="line.156"></a>
160 <FONT color="green">157</FONT> <a name="line.157"></a>
161 <FONT color="green">158</FONT> /**<a name="line.158"></a>
162 <FONT color="green">159</FONT> * Access the population size.<a name="line.159"></a>
163 <FONT color="green">160</FONT> *<a name="line.160"></a>
164 <FONT color="green">161</FONT> * @return the population size.<a name="line.161"></a>
165 <FONT color="green">162</FONT> */<a name="line.162"></a>
166 <FONT color="green">163</FONT> public int getPopulationSize() {<a name="line.163"></a>
167 <FONT color="green">164</FONT> return populationSize;<a name="line.164"></a>
168 <FONT color="green">165</FONT> }<a name="line.165"></a>
169 <FONT color="green">166</FONT> <a name="line.166"></a>
170 <FONT color="green">167</FONT> /**<a name="line.167"></a>
171 <FONT color="green">168</FONT> * Access the sample size.<a name="line.168"></a>
172 <FONT color="green">169</FONT> *<a name="line.169"></a>
173 <FONT color="green">170</FONT> * @return the sample size.<a name="line.170"></a>
174 <FONT color="green">171</FONT> */<a name="line.171"></a>
175 <FONT color="green">172</FONT> public int getSampleSize() {<a name="line.172"></a>
176 <FONT color="green">173</FONT> return sampleSize;<a name="line.173"></a>
177 <FONT color="green">174</FONT> }<a name="line.174"></a>
178 <FONT color="green">175</FONT> <a name="line.175"></a>
179 <FONT color="green">176</FONT> /**<a name="line.176"></a>
180 <FONT color="green">177</FONT> * Return the highest domain value for the given hypergeometric distribution<a name="line.177"></a>
181 <FONT color="green">178</FONT> * parameters.<a name="line.178"></a>
182 <FONT color="green">179</FONT> *<a name="line.179"></a>
183 <FONT color="green">180</FONT> * @param m number of successes in the population.<a name="line.180"></a>
184 <FONT color="green">181</FONT> * @param k the sample size.<a name="line.181"></a>
185 <FONT color="green">182</FONT> * @return the highest domain value of the hypergeometric distribution.<a name="line.182"></a>
186 <FONT color="green">183</FONT> */<a name="line.183"></a>
187 <FONT color="green">184</FONT> private int getUpperDomain(int m, int k) {<a name="line.184"></a>
188 <FONT color="green">185</FONT> return Math.min(k, m);<a name="line.185"></a>
189 <FONT color="green">186</FONT> }<a name="line.186"></a>
190 <FONT color="green">187</FONT> <a name="line.187"></a>
191 <FONT color="green">188</FONT> /**<a name="line.188"></a>
192 <FONT color="green">189</FONT> * For this distribution, X, this method returns P(X = x).<a name="line.189"></a>
193 <FONT color="green">190</FONT> *<a name="line.190"></a>
194 <FONT color="green">191</FONT> * @param x the value at which the PMF is evaluated.<a name="line.191"></a>
195 <FONT color="green">192</FONT> * @return PMF for this distribution.<a name="line.192"></a>
196 <FONT color="green">193</FONT> */<a name="line.193"></a>
197 <FONT color="green">194</FONT> public double probability(int x) {<a name="line.194"></a>
198 <FONT color="green">195</FONT> double ret;<a name="line.195"></a>
199 <FONT color="green">196</FONT> <a name="line.196"></a>
200 <FONT color="green">197</FONT> int[] domain = getDomain(populationSize, numberOfSuccesses, sampleSize);<a name="line.197"></a>
201 <FONT color="green">198</FONT> if (x &lt; domain[0] || x &gt; domain[1]) {<a name="line.198"></a>
202 <FONT color="green">199</FONT> ret = 0.0;<a name="line.199"></a>
203 <FONT color="green">200</FONT> } else {<a name="line.200"></a>
204 <FONT color="green">201</FONT> double p = (double) sampleSize / (double) populationSize;<a name="line.201"></a>
205 <FONT color="green">202</FONT> double q = (double) (populationSize - sampleSize) / (double) populationSize;<a name="line.202"></a>
206 <FONT color="green">203</FONT> double p1 = SaddlePointExpansion.logBinomialProbability(x,<a name="line.203"></a>
207 <FONT color="green">204</FONT> numberOfSuccesses, p, q);<a name="line.204"></a>
208 <FONT color="green">205</FONT> double p2 =<a name="line.205"></a>
209 <FONT color="green">206</FONT> SaddlePointExpansion.logBinomialProbability(sampleSize - x,<a name="line.206"></a>
210 <FONT color="green">207</FONT> populationSize - numberOfSuccesses, p, q);<a name="line.207"></a>
211 <FONT color="green">208</FONT> double p3 =<a name="line.208"></a>
212 <FONT color="green">209</FONT> SaddlePointExpansion.logBinomialProbability(sampleSize, populationSize, p, q);<a name="line.209"></a>
213 <FONT color="green">210</FONT> ret = Math.exp(p1 + p2 - p3);<a name="line.210"></a>
214 <FONT color="green">211</FONT> }<a name="line.211"></a>
215 <FONT color="green">212</FONT> <a name="line.212"></a>
216 <FONT color="green">213</FONT> return ret;<a name="line.213"></a>
217 <FONT color="green">214</FONT> }<a name="line.214"></a>
218 <FONT color="green">215</FONT> <a name="line.215"></a>
219 <FONT color="green">216</FONT> /**<a name="line.216"></a>
220 <FONT color="green">217</FONT> * For the distribution, X, defined by the given hypergeometric distribution<a name="line.217"></a>
221 <FONT color="green">218</FONT> * parameters, this method returns P(X = x).<a name="line.218"></a>
222 <FONT color="green">219</FONT> *<a name="line.219"></a>
223 <FONT color="green">220</FONT> * @param n the population size.<a name="line.220"></a>
224 <FONT color="green">221</FONT> * @param m number of successes in the population.<a name="line.221"></a>
225 <FONT color="green">222</FONT> * @param k the sample size.<a name="line.222"></a>
226 <FONT color="green">223</FONT> * @param x the value at which the PMF is evaluated.<a name="line.223"></a>
227 <FONT color="green">224</FONT> * @return PMF for the distribution.<a name="line.224"></a>
228 <FONT color="green">225</FONT> */<a name="line.225"></a>
229 <FONT color="green">226</FONT> private double probability(int n, int m, int k, int x) {<a name="line.226"></a>
230 <FONT color="green">227</FONT> return Math.exp(MathUtils.binomialCoefficientLog(m, x) +<a name="line.227"></a>
231 <FONT color="green">228</FONT> MathUtils.binomialCoefficientLog(n - m, k - x) -<a name="line.228"></a>
232 <FONT color="green">229</FONT> MathUtils.binomialCoefficientLog(n, k));<a name="line.229"></a>
233 <FONT color="green">230</FONT> }<a name="line.230"></a>
234 <FONT color="green">231</FONT> <a name="line.231"></a>
235 <FONT color="green">232</FONT> /**<a name="line.232"></a>
236 <FONT color="green">233</FONT> * Modify the number of successes.<a name="line.233"></a>
237 <FONT color="green">234</FONT> *<a name="line.234"></a>
238 <FONT color="green">235</FONT> * @param num the new number of successes.<a name="line.235"></a>
239 <FONT color="green">236</FONT> * @throws IllegalArgumentException if &lt;code&gt;num&lt;/code&gt; is negative.<a name="line.236"></a>
240 <FONT color="green">237</FONT> * @deprecated as of 2.1 (class will become immutable in 3.0)<a name="line.237"></a>
241 <FONT color="green">238</FONT> */<a name="line.238"></a>
242 <FONT color="green">239</FONT> @Deprecated<a name="line.239"></a>
243 <FONT color="green">240</FONT> public void setNumberOfSuccesses(int num) {<a name="line.240"></a>
244 <FONT color="green">241</FONT> setNumberOfSuccessesInternal(num);<a name="line.241"></a>
245 <FONT color="green">242</FONT> }<a name="line.242"></a>
246 <FONT color="green">243</FONT> /**<a name="line.243"></a>
247 <FONT color="green">244</FONT> * Modify the number of successes.<a name="line.244"></a>
248 <FONT color="green">245</FONT> *<a name="line.245"></a>
249 <FONT color="green">246</FONT> * @param num the new number of successes.<a name="line.246"></a>
250 <FONT color="green">247</FONT> * @throws IllegalArgumentException if &lt;code&gt;num&lt;/code&gt; is negative.<a name="line.247"></a>
251 <FONT color="green">248</FONT> */<a name="line.248"></a>
252 <FONT color="green">249</FONT> private void setNumberOfSuccessesInternal(int num) {<a name="line.249"></a>
253 <FONT color="green">250</FONT> if (num &lt; 0) {<a name="line.250"></a>
254 <FONT color="green">251</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.251"></a>
255 <FONT color="green">252</FONT> "number of successes must be non-negative ({0})", num);<a name="line.252"></a>
256 <FONT color="green">253</FONT> }<a name="line.253"></a>
257 <FONT color="green">254</FONT> numberOfSuccesses = num;<a name="line.254"></a>
258 <FONT color="green">255</FONT> }<a name="line.255"></a>
259 <FONT color="green">256</FONT> <a name="line.256"></a>
260 <FONT color="green">257</FONT> /**<a name="line.257"></a>
261 <FONT color="green">258</FONT> * Modify the population size.<a name="line.258"></a>
262 <FONT color="green">259</FONT> *<a name="line.259"></a>
263 <FONT color="green">260</FONT> * @param size the new population size.<a name="line.260"></a>
264 <FONT color="green">261</FONT> * @throws IllegalArgumentException if &lt;code&gt;size&lt;/code&gt; is not positive.<a name="line.261"></a>
265 <FONT color="green">262</FONT> * @deprecated as of 2.1 (class will become immutable in 3.0)<a name="line.262"></a>
266 <FONT color="green">263</FONT> */<a name="line.263"></a>
267 <FONT color="green">264</FONT> @Deprecated<a name="line.264"></a>
268 <FONT color="green">265</FONT> public void setPopulationSize(int size) {<a name="line.265"></a>
269 <FONT color="green">266</FONT> setPopulationSizeInternal(size);<a name="line.266"></a>
270 <FONT color="green">267</FONT> }<a name="line.267"></a>
271 <FONT color="green">268</FONT> /**<a name="line.268"></a>
272 <FONT color="green">269</FONT> * Modify the population size.<a name="line.269"></a>
273 <FONT color="green">270</FONT> *<a name="line.270"></a>
274 <FONT color="green">271</FONT> * @param size the new population size.<a name="line.271"></a>
275 <FONT color="green">272</FONT> * @throws IllegalArgumentException if &lt;code&gt;size&lt;/code&gt; is not positive.<a name="line.272"></a>
276 <FONT color="green">273</FONT> */<a name="line.273"></a>
277 <FONT color="green">274</FONT> private void setPopulationSizeInternal(int size) {<a name="line.274"></a>
278 <FONT color="green">275</FONT> if (size &lt;= 0) {<a name="line.275"></a>
279 <FONT color="green">276</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.276"></a>
280 <FONT color="green">277</FONT> "population size must be positive ({0})", size);<a name="line.277"></a>
281 <FONT color="green">278</FONT> }<a name="line.278"></a>
282 <FONT color="green">279</FONT> populationSize = size;<a name="line.279"></a>
283 <FONT color="green">280</FONT> }<a name="line.280"></a>
284 <FONT color="green">281</FONT> <a name="line.281"></a>
285 <FONT color="green">282</FONT> /**<a name="line.282"></a>
286 <FONT color="green">283</FONT> * Modify the sample size.<a name="line.283"></a>
287 <FONT color="green">284</FONT> *<a name="line.284"></a>
288 <FONT color="green">285</FONT> * @param size the new sample size.<a name="line.285"></a>
289 <FONT color="green">286</FONT> * @throws IllegalArgumentException if &lt;code&gt;size&lt;/code&gt; is negative.<a name="line.286"></a>
290 <FONT color="green">287</FONT> * @deprecated as of 2.1 (class will become immutable in 3.0)<a name="line.287"></a>
291 <FONT color="green">288</FONT> */<a name="line.288"></a>
292 <FONT color="green">289</FONT> @Deprecated<a name="line.289"></a>
293 <FONT color="green">290</FONT> public void setSampleSize(int size) {<a name="line.290"></a>
294 <FONT color="green">291</FONT> setSampleSizeInternal(size);<a name="line.291"></a>
295 <FONT color="green">292</FONT> }<a name="line.292"></a>
296 <FONT color="green">293</FONT> /**<a name="line.293"></a>
297 <FONT color="green">294</FONT> * Modify the sample size.<a name="line.294"></a>
298 <FONT color="green">295</FONT> *<a name="line.295"></a>
299 <FONT color="green">296</FONT> * @param size the new sample size.<a name="line.296"></a>
300 <FONT color="green">297</FONT> * @throws IllegalArgumentException if &lt;code&gt;size&lt;/code&gt; is negative.<a name="line.297"></a>
301 <FONT color="green">298</FONT> */<a name="line.298"></a>
302 <FONT color="green">299</FONT> private void setSampleSizeInternal(int size) {<a name="line.299"></a>
303 <FONT color="green">300</FONT> if (size &lt; 0) {<a name="line.300"></a>
304 <FONT color="green">301</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.301"></a>
305 <FONT color="green">302</FONT> "sample size must be positive ({0})", size);<a name="line.302"></a>
306 <FONT color="green">303</FONT> }<a name="line.303"></a>
307 <FONT color="green">304</FONT> sampleSize = size;<a name="line.304"></a>
308 <FONT color="green">305</FONT> }<a name="line.305"></a>
309 <FONT color="green">306</FONT> <a name="line.306"></a>
310 <FONT color="green">307</FONT> /**<a name="line.307"></a>
311 <FONT color="green">308</FONT> * For this distribution, X, this method returns P(X &amp;ge; x).<a name="line.308"></a>
312 <FONT color="green">309</FONT> *<a name="line.309"></a>
313 <FONT color="green">310</FONT> * @param x the value at which the CDF is evaluated.<a name="line.310"></a>
314 <FONT color="green">311</FONT> * @return upper tail CDF for this distribution.<a name="line.311"></a>
315 <FONT color="green">312</FONT> * @since 1.1<a name="line.312"></a>
316 <FONT color="green">313</FONT> */<a name="line.313"></a>
317 <FONT color="green">314</FONT> public double upperCumulativeProbability(int x) {<a name="line.314"></a>
318 <FONT color="green">315</FONT> double ret;<a name="line.315"></a>
319 <FONT color="green">316</FONT> <a name="line.316"></a>
320 <FONT color="green">317</FONT> final int[] domain = getDomain(populationSize, numberOfSuccesses, sampleSize);<a name="line.317"></a>
321 <FONT color="green">318</FONT> if (x &lt; domain[0]) {<a name="line.318"></a>
322 <FONT color="green">319</FONT> ret = 1.0;<a name="line.319"></a>
323 <FONT color="green">320</FONT> } else if (x &gt; domain[1]) {<a name="line.320"></a>
324 <FONT color="green">321</FONT> ret = 0.0;<a name="line.321"></a>
325 <FONT color="green">322</FONT> } else {<a name="line.322"></a>
326 <FONT color="green">323</FONT> ret = innerCumulativeProbability(domain[1], x, -1, populationSize, numberOfSuccesses, sampleSize);<a name="line.323"></a>
327 <FONT color="green">324</FONT> }<a name="line.324"></a>
328 <FONT color="green">325</FONT> <a name="line.325"></a>
329 <FONT color="green">326</FONT> return ret;<a name="line.326"></a>
330 <FONT color="green">327</FONT> }<a name="line.327"></a>
331 <FONT color="green">328</FONT> <a name="line.328"></a>
332 <FONT color="green">329</FONT> /**<a name="line.329"></a>
333 <FONT color="green">330</FONT> * For this distribution, X, this method returns P(x0 &amp;le; X &amp;le; x1). This<a name="line.330"></a>
334 <FONT color="green">331</FONT> * probability is computed by summing the point probabilities for the values<a name="line.331"></a>
335 <FONT color="green">332</FONT> * x0, x0 + 1, x0 + 2, ..., x1, in the order directed by dx.<a name="line.332"></a>
336 <FONT color="green">333</FONT> *<a name="line.333"></a>
337 <FONT color="green">334</FONT> * @param x0 the inclusive, lower bound<a name="line.334"></a>
338 <FONT color="green">335</FONT> * @param x1 the inclusive, upper bound<a name="line.335"></a>
339 <FONT color="green">336</FONT> * @param dx the direction of summation. 1 indicates summing from x0 to x1.<a name="line.336"></a>
340 <FONT color="green">337</FONT> * 0 indicates summing from x1 to x0.<a name="line.337"></a>
341 <FONT color="green">338</FONT> * @param n the population size.<a name="line.338"></a>
342 <FONT color="green">339</FONT> * @param m number of successes in the population.<a name="line.339"></a>
343 <FONT color="green">340</FONT> * @param k the sample size.<a name="line.340"></a>
344 <FONT color="green">341</FONT> * @return P(x0 &amp;le; X &amp;le; x1).<a name="line.341"></a>
345 <FONT color="green">342</FONT> */<a name="line.342"></a>
346 <FONT color="green">343</FONT> private double innerCumulativeProbability(int x0, int x1, int dx, int n,<a name="line.343"></a>
347 <FONT color="green">344</FONT> int m, int k) {<a name="line.344"></a>
348 <FONT color="green">345</FONT> double ret = probability(n, m, k, x0);<a name="line.345"></a>
349 <FONT color="green">346</FONT> while (x0 != x1) {<a name="line.346"></a>
350 <FONT color="green">347</FONT> x0 += dx;<a name="line.347"></a>
351 <FONT color="green">348</FONT> ret += probability(n, m, k, x0);<a name="line.348"></a>
352 <FONT color="green">349</FONT> }<a name="line.349"></a>
353 <FONT color="green">350</FONT> return ret;<a name="line.350"></a>
354 <FONT color="green">351</FONT> }<a name="line.351"></a>
355 <FONT color="green">352</FONT> }<a name="line.352"></a>
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416 </PRE>
417 </BODY>
418 </HTML>