18template <
typename TX,
typename TY>
20 m_xUpperBound(static_cast<float>(xUpperBound)),
21 m_useWidths(useWidths),
22 m_discreteProbabilityData(this->InitialiseDiscreteProbabilityData(inputData))
30 m_xUpperBound(discreteProbabilityVector.m_xUpperBound),
31 m_useWidths(discreteProbabilityVector.m_useWidths),
32 m_discreteProbabilityData(this->RandomiseDiscreteProbabilityData(discreteProbabilityVector, randomNumberGenerator))
40 m_xUpperBound(discreteProbabilityVector.m_xUpperBound),
41 m_useWidths(discreteProbabilityVector.m_useWidths),
42 m_discreteProbabilityData(this->ResampleDiscreteProbabilityData(discreteProbabilityVector, resamplingPoints))
67 if (std::fabs(xHigh - xLow) < std::numeric_limits<float>::epsilon())
70 const float m((yHigh - yLow) / (xHigh - xLow));
71 const float c(yLow - m * xLow);
81template <
typename TX,
typename TY>
84 if (2 > inputData.size())
87 std::sort(inputData.begin(), inputData.end(), DiscreteProbabilityVector::SortInputDataByX<TX, TY>);
89 if (inputData.back().first -
m_xUpperBound > std::numeric_limits<float>::epsilon())
94 if (normalisation < std::numeric_limits<float>::epsilon())
97 float accumulationDatum(0.f);
100 for (
unsigned int iDatum = 0; iDatum < inputData.size() - 1; ++iDatum)
102 const float x(
static_cast<float>(inputData.at(iDatum).first));
103 const float deltaX(
static_cast<float>(inputData.at(iDatum + 1).first) - x);
104 const float densityDatum(
static_cast<float>(inputData.at(iDatum).second) / normalisation);
105 accumulationDatum += densityDatum * (
m_useWidths ? deltaX : 1.f);
108 const float x(
static_cast<float>(inputData.back().first));
110 const float densityDatum(
static_cast<float>(inputData.back().second) / normalisation);
111 accumulationDatum += densityDatum * (
m_useWidths ? deltaX : 1.f);
122 if (2 > resamplingPoints.size())
127 float prevCumulativeData(0.f);
128 for (
unsigned int iSample = 0; iSample < resamplingPoints.size() - 1; ++iSample)
130 const float xResampled(resamplingPoints.at(iSample));
131 const float deltaX(resamplingPoints.at(iSample + 1) - xResampled);
133 if (deltaX < std::numeric_limits<float>::epsilon())
137 const float densityDatumResampled((cumulativeDatumResampled - prevCumulativeData) / (
m_useWidths ? deltaX : 1.f));
138 resampledProbabilityData.emplace_back(
140 prevCumulativeData = cumulativeDatumResampled;
143 const float xResampled(resamplingPoints.back());
146 if (deltaX < std::numeric_limits<float>::epsilon())
150 const float densityDatumResampled((cumulativeDatumResampled - prevCumulativeData) / (
m_useWidths ? deltaX : 1.f));
151 resampledProbabilityData.emplace_back(
154 return resampledProbabilityData;
164 std::vector<unsigned int> randomisedElements(discreteProbabilityVector.
GetSize());
165 std::iota(std::begin(randomisedElements), std::end(randomisedElements), 0);
166 std::shuffle(std::begin(randomisedElements), std::end(randomisedElements), randomNumberGenerator);
168 float xPos(discreteProbabilityVector.
GetX(0));
169 float cumulativeProbability(0.f);
170 for (
unsigned int iElement = 0; iElement < discreteProbabilityVector.
GetSize(); ++iElement)
172 const unsigned int randomElementIndex(randomisedElements.at(iElement));
173 const float deltaX(discreteProbabilityVector.
GetWidth(randomElementIndex));
175 cumulativeProbability += probabilityDensity * (
m_useWidths ? deltaX : 1.f);
176 randomisedProbabilityData.emplace_back(
181 return randomisedProbabilityData;
186template <
typename TX,
typename TY>
189 const float deltaX(
static_cast<float>(rhs.first) -
static_cast<float>(lhs.first));
190 if (std::fabs(deltaX) < std::numeric_limits<float>::epsilon())
191 return (lhs.second < rhs.second);
193 return (lhs.first < rhs.first);
198template <
typename TX,
typename TY>
201 if (2 > inputData.size())
204 float normalisation(0.f);
206 for (
unsigned int iDatum = 0; iDatum < inputData.size() - 1; ++iDatum)
208 const float y(
static_cast<float>(inputData.at(iDatum).second));
210 y * (
m_useWidths ?
static_cast<float>(inputData.at(iDatum + 1).first) -
static_cast<float>(inputData.at(iDatum).first) : 1.f);
212 const float y(
static_cast<float>(inputData.back().second));
215 return normalisation;
Header file for the lar discrete probability vector class.
DiscreteProbabilityData class.
DiscreteProbabilityVector class.
void VerifyCompleteData() const
Verify the integrity of the complete probability vector.
DiscreteProbabilityData InitialiseDiscreteProbabilityData(InputData< TX, TY > inputData) const
Get a initialised probability data vector from the input data.
pandora::FloatVector ResamplingPoints
float m_xUpperBound
the upper bound of the probability vector
DiscreteProbabilityData ResampleDiscreteProbabilityData(const DiscreteProbabilityVector &discreteProbabilityVector, const ResamplingPoints &resamplingPoints) const
Get a resampled probability data vector by resampling another probability data vector.
float GetWidth(const unsigned int index) const
Get the width of the element in the vectorr.
bool m_useWidths
controls whether bin widths are used in calculations
float CalculateNormalisation(const InputData< TX, TY > &inputData) const
Calculate the probability normalisation.
DiscreteProbabilityVector(const InputData< TX, TY > &inputData, const TX xUpperBound, const bool useWidths)
Constructor.
DiscreteProbabilityData RandomiseDiscreteProbabilityData(const DiscreteProbabilityVector &discreteProbabilityVector, std::mt19937 &randomNumberGenerator) const
Get a randomised probability data vector in which the x values are unchanged, the probability density...
unsigned int GetSize() const
Get the size of the probability vector.
float EvaluateCumulativeProbability(const float x) const
Evaluate the cumulative probability at arbitrary x.
float GetProbabilityDensity(const unsigned int index) const
Get the probability density value of the element in the vector.
float GetX(const unsigned int index) const
Get the x value of the element in the vector.
static bool SortInputDataByX(const InputDatum< TX, TY > &lhs, const InputDatum< TX, TY > &rhs)
Sort the input data according to their x value.
std::vector< InputDatum< TX, TY > > InputData
std::pair< TX, TY > InputDatum
std::vector< DiscreteProbabilityDatum > DiscreteProbabilityData
DiscreteProbabilityData m_discreteProbabilityData
the probability data
StatusCodeException class.