FaceGen 3 SDKs Reference
Loading...
Searching...
No Matches
FutDensity.hpp
1//
2// Copyright (c) Singular Inversions Inc. 2000.
3//
4// Authors: Andrew Beatty
5// Created: Jan 6, 2000.
6//
7// Encapsulated calculations involving normal probability densities
8// including univariate normal and multivariate standard normal.
9
10#ifndef FUT_DENSITY_HPP
11#define FUT_DENSITY_HPP
12
13#include <cmath>
14#include "algs.hpp"
15#include "FgSerial.hpp"
16#include "FgMath.hpp"
17
18namespace Fg {
19
21{
22 double meanP;
23 double inv_2_var; // Inverse of twice the variance.
24 double inv_std; // Inverse of the standard deviation
25
26 FutNormDensityC() : meanP(0), inv_2_var(0.5), inv_std(1.0) {};
27 // Default std. norm
28 FutNormDensityC(double m,double s) {setStd(m,s);}
29 void setMean(double m) {meanP = m;}
30 void setStd(double m,double s);
31 double lnDensityRatio(double) const;
32 double valToMahal(double) const;
33 double mahalToVal(double) const;
34 double mean() const {return meanP;};
35 double variance() const {return (0.5 / inv_2_var);}
36 double std() const {return (1.0 / inv_std);}
37};
38
40{
41 double valToMahal(double x) const {return x;}
42 double mahalToVal(double x) const {return x;}
43 double lnDensityRatio(double x) const {return -0.5 * x*x;}
44};
45
46inline void FutNormDensityC::setStd(
47 double m, // Given mean
48 double s) // and std
49{
50 FGASSERT(s > 0.0); // Must have positive std.
51
52 meanP = m;
53 inv_2_var = 1.0 / (2.0 * s * s);
54 inv_std = 1.0 / s;
55}
56
57inline
58double
59FutNormDensityC::valToMahal(double x) const
60{
61 return ((x - meanP) * inv_std);
62}
63
64inline
65double
66FutNormDensityC::mahalToVal(double x) const
67{
68 return (x / inv_std + meanP);
69}
70
71inline
72double FutNormDensityC::lnDensityRatio(double x) const
73{
74 return (-sqr(x - meanP) * inv_2_var);
75}
76
77}
78
79#endif