Skip to content
Snippets Groups Projects
Commit 2c9e2fb5 authored by Van Herck, Walter's avatar Van Herck, Walter
Browse files

Merge branch 'wvh_stochasticparameter'

Conflicts:
	Core/Core.pro
parents 54543244 b1364d7e
No related branches found
No related tags found
No related merge requests found
......@@ -24,7 +24,9 @@ SOURCES += \
src/IRoughness.cpp \
src/LayerInterface.cpp \
src/IMaterial.cpp \
src/MaterialManager.cpp
src/MaterialManager.cpp \
src/StochasticGaussian.cpp \
src/MathFunctions.cpp \
HEADERS += \
inc/ISample.h \
......@@ -44,7 +46,10 @@ HEADERS += \
inc/OpticalFresnel.h \
inc/IRoughness.h \
inc/LayerInterface.h \
inc/MaterialManager.h
inc/MaterialManager.h \
inc/IStochasticParameter.h \
inc/StochasticGaussian.h \
inc/MathFunctions.h
INCLUDEPATH += ./inc
......
#ifndef ISTOCHASTICPARAMETER_H
#define ISTOCHASTICPARAMETER_H
class IStochasticParameter
{
public:
virtual ~IStochasticParameter() {}
virtual void setToRandom()=0;
virtual void setToAverage()=0;
};
#endif // ISTOCHASTICPARAMETER_H
#ifndef MATHFUNCTIONS_H
#define MATHFUNCTIONS_H
#include <cstdlib>
namespace MathFunctions
{
double Gaussian(double value, double average, double std_dev);
double GenerateNormalRandom(double average, double std_dev);
double StandardNormal(double value);
double GenerateStandardNormalRandom();
double GenerateUniformRandom();
} // Namespace MathFunctions
inline double MathFunctions::GenerateNormalRandom(double average, double std_dev)
{
return GenerateStandardNormalRandom()*std_dev + average;
}
inline double MathFunctions::GenerateUniformRandom()
{
int random_int = std::rand();
return (double)random_int / RAND_MAX;
}
#endif // MATHFUNCTIONS_H
#ifndef STOCHASTICGAUSSIAN_H
#define STOCHASTICGAUSSIAN_H
#include "IStochasticParameter.h"
class StochasticDoubleGaussian : public IStochasticParameter
{
public:
StochasticDoubleGaussian(double average, double std_dev);
~StochasticDoubleGaussian();
virtual void setToRandom();
virtual void setToAverage();
double getCurrent() { return m_current; }
double getRandom();
double getAverage();
double getStdDev() { return m_std_dev; }
double getCurrentProbDensity();
private:
double m_current;
double m_average;
double m_std_dev;
};
#endif // STOCHASTICGAUSSIAN_H
#include "MathFunctions.h"
#include <cmath>
double MathFunctions::Gaussian(double value, double average, double std_dev)
{
return StandardNormal((value-average)/std_dev)/std_dev;
}
double MathFunctions::StandardNormal(double value)
{
return std::exp(- value*value / 2.0) / std::sqrt(2.0*M_PI);
}
double MathFunctions::GenerateStandardNormalRandom() // using Box-Muller transform
{
double u1 = GenerateUniformRandom();
double u2 = GenerateUniformRandom();
return std::sqrt(-2.0*std::log(u1))*std::cos(2*M_PI*u2);
}
#include "StochasticGaussian.h"
#include "MathFunctions.h"
StochasticDoubleGaussian::StochasticDoubleGaussian(double average, double std_dev)
: m_average(average)
, m_std_dev(std_dev)
{
}
StochasticDoubleGaussian::~StochasticDoubleGaussian()
{
}
void StochasticDoubleGaussian::setToRandom()
{
m_current = MathFunctions::GenerateNormalRandom(m_average, m_std_dev);
}
void StochasticDoubleGaussian::setToAverage()
{
m_current = m_average;
}
double StochasticDoubleGaussian::getRandom()
{
setToRandom();
return getCurrent();
}
double StochasticDoubleGaussian::getAverage()
{
setToAverage();
return getCurrent();
}
double StochasticDoubleGaussian::getCurrentProbDensity()
{
return MathFunctions::Gaussian(m_current, m_average, m_std_dev);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment