-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathR1UnivariateNormal.java
302 lines (263 loc) · 9.17 KB
/
R1UnivariateNormal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
package org.drip.measure.gaussian;
/*
* -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*/
/*!
* Copyright (C) 2022 Lakshmi Krishnamurthy
* Copyright (C) 2021 Lakshmi Krishnamurthy
* Copyright (C) 2020 Lakshmi Krishnamurthy
* Copyright (C) 2019 Lakshmi Krishnamurthy
* Copyright (C) 2018 Lakshmi Krishnamurthy
* Copyright (C) 2017 Lakshmi Krishnamurthy
* Copyright (C) 2016 Lakshmi Krishnamurthy
* Copyright (C) 2015 Lakshmi Krishnamurthy
* Copyright (C) 2014 Lakshmi Krishnamurthy
* Copyright (C) 2013 Lakshmi Krishnamurthy
*
* This file is part of DROP, an open-source library targeting analytics/risk, transaction cost analytics,
* asset liability management analytics, capital, exposure, and margin analytics, valuation adjustment
* analytics, and portfolio construction analytics within and across fixed income, credit, commodity,
* equity, FX, and structured products. It also includes auxiliary libraries for algorithm support,
* numerical analysis, numerical optimization, spline builder, model validation, statistical learning,
* graph builder/navigator, and computational support.
*
* https://lakshmidrip.github.io/DROP/
*
* DROP is composed of three modules:
*
* - DROP Product Core - https://lakshmidrip.github.io/DROP-Product-Core/
* - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
* - DROP Computational Core - https://lakshmidrip.github.io/DROP-Computational-Core/
*
* DROP Product Core implements libraries for the following:
* - Fixed Income Analytics
* - Loan Analytics
* - Transaction Cost Analytics
*
* DROP Portfolio Core implements libraries for the following:
* - Asset Allocation Analytics
* - Asset Liability Management Analytics
* - Capital Estimation Analytics
* - Exposure Analytics
* - Margin Analytics
* - XVA Analytics
*
* DROP Computational Core implements libraries for the following:
* - Algorithm Support
* - Computation Support
* - Function Analysis
* - Graph Algorithm
* - Model Validation
* - Numerical Analysis
* - Numerical Optimizer
* - Spline Builder
* - Statistical Learning
*
* Documentation for DROP is Spread Over:
*
* - Main => https://lakshmidrip.github.io/DROP/
* - Wiki => https://github.com/lakshmiDRIP/DROP/wiki
* - GitHub => https://github.com/lakshmiDRIP/DROP
* - Repo Layout Taxonomy => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
* - Javadoc => https://lakshmidrip.github.io/DROP/Javadoc/index.html
* - Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
* - Release Versions => https://lakshmidrip.github.io/DROP/version.html
* - Community Credits => https://lakshmidrip.github.io/DROP/credits.html
* - Issues Catalog => https://github.com/lakshmiDRIP/DROP/issues
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* <i>R1UnivariateNormal</i> implements the Univariate R<sup>1</sup> Normal Distribution. It implements the
* Incremental, the Cumulative, and the Inverse Cumulative Distribution Densities.
*
* <br><br>
* <ul>
* <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ComputationalCore.md">Computational Core Module</a></li>
* <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/NumericalAnalysisLibrary.md">Numerical Analysis Library</a></li>
* <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/measure/README.md">R<sup>d</sup> Continuous/Discrete Probability Measures</a></li>
* <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/measure/gaussian/README.md">R<sup>1</sup> R<sup>d</sup> Covariant Gaussian Quadrature</a></li>
* </ul>
*
* @author Lakshmi Krishnamurthy
*/
public class R1UnivariateNormal extends org.drip.measure.continuous.R1Univariate {
private double _dblMean = java.lang.Double.NaN;
private double _dblSigma = java.lang.Double.NaN;
/**
* Generate a N (0, 1) distribution
*
* @return The N (0, 1) distribution
*/
public static final org.drip.measure.gaussian.R1UnivariateNormal Standard()
{
try {
return new R1UnivariateNormal (0., 1.);
} catch (java.lang.Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Construct a R1 Normal/Gaussian Distribution
*
* @param dblMean Mean of the Distribution
* @param dblSigma Sigma of the Distribution
*
* @throws java.lang.Exception Thrown if the inputs are invalid
*/
public R1UnivariateNormal (
final double dblMean,
final double dblSigma)
throws java.lang.Exception
{
if (!org.drip.numerical.common.NumberUtil.IsValid (_dblMean = dblMean) ||
!org.drip.numerical.common.NumberUtil.IsValid (_dblSigma = dblSigma) || 0. > _dblSigma)
throw new java.lang.Exception ("R1UnivariateNormal Constructor: Invalid Inputs");
}
/**
* Retrieve the Sigma
*
* @return The Sigma
*/
public double sigma()
{
return _dblSigma;
}
@Override public double[] support()
{
return new double[]
{
java.lang.Double.NEGATIVE_INFINITY,
java.lang.Double.POSITIVE_INFINITY
};
}
@Override public double cumulative (
final double dblX)
throws java.lang.Exception
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblX))
throw new java.lang.Exception ("R1UnivariateNormal::cumulative => Invalid Inputs");
if (0. == _dblSigma) return dblX >= _dblMean ? 1. : 0.;
return org.drip.measure.gaussian.NormalQuadrature.CDF ((dblX - _dblMean) / _dblSigma);
}
@Override public double incremental (
final double dblXLeft,
final double dblXRight)
throws java.lang.Exception
{
return cumulative (dblXRight) - cumulative (dblXLeft);
}
@Override public double invCumulative (
final double dblY)
throws java.lang.Exception
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblY) || 0. == _dblSigma)
throw new java.lang.Exception ("R1UnivariateNormal::invCumulative => Cannot calculate");
return org.drip.measure.gaussian.NormalQuadrature.InverseCDF (dblY) * _dblSigma + _dblMean;
}
@Override public double density (
final double dblX)
throws java.lang.Exception
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblX))
throw new java.lang.Exception ("R1UnivariateNormal::density => Invalid Inputs");
if (0. == _dblSigma) return dblX == _dblMean ? 1. : 0.;
double dblMeanShift = (dblX - _dblMean) / _dblSigma;
return java.lang.Math.exp (-0.5 * dblMeanShift * dblMeanShift);
}
@Override public double mean()
{
return _dblMean;
}
@Override public double median()
{
return _dblMean;
}
@Override public double mode()
{
return _dblMean;
}
@Override public double variance()
{
return _dblSigma * _dblSigma;
}
@Override public org.drip.numerical.common.Array2D histogram()
{
return null;
}
@Override public double random()
{
try
{
return invCumulative (java.lang.Math.random());
}
catch (java.lang.Exception e)
{
e.printStackTrace();
}
return java.lang.Double.NaN;
}
/**
* Compute the Error Function Around an Absolute Width around the Mean
*
* @param dblX The Width
*
* @return The Error Function Around an Absolute Width around the Mean
*
* @throws java.lang.Exception Thrown if the Inputs are Invalid
*/
public double errorFunction (
final double dblX)
throws java.lang.Exception
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblX))
throw new java.lang.Exception ("R1UnivariateNormal::errorFunction => Invalid Inputs");
double dblWidth = java.lang.Math.abs (dblX);
return cumulative (_dblMean + dblWidth) - cumulative (_dblMean - dblWidth);
}
/**
* Compute the Confidence given the Width around the Mean
*
* @param dblWidth The Width
*
* @return The Error Function Around an Absolute Width around the Mean
*
* @throws java.lang.Exception Thrown if the Inputs are Invalid
*/
public double confidence (
final double dblWidth)
throws java.lang.Exception
{
return errorFunction (dblWidth);
}
/**
* Compute the Width around the Mean given the Confidence Level
*
* @param dblConfidence The Confidence Level
*
* @return The Width around the Mean given the Confidence Level
*
* @throws java.lang.Exception Thrown if the Inputs are Invalid
*/
public double confidenceInterval (
final double dblConfidence)
throws java.lang.Exception
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblConfidence) || 0. >= dblConfidence || 1. <=
dblConfidence)
throw new java.lang.Exception ("R1UnivariateNormal::confidenceInterval => Invalid Inputs");
return invCumulative (0.5 * (1. + dblConfidence));
}
}