3#ifndef cMHN_UTILITY_GENERATE_PD_H
4#define cMHN_UTILITY_GENERATE_PD_H
27 template<
class T, pRC::Size D>
30 T const &toleranceSolverP)
33 decltype(expand(pRC::makeConstantSequence<pRC::Size, D, 2>(),
36 return pRC::Subscripts<seq...>();
39 std::map<Subscripts, T> pD;
40 pRC::UnsignedInteger<64> pDSum = 0;
45 pRC::UniformDistribution<T> dist;
47 for(pRC::Index i = 0; i < size; ++i)
50 T const r = pRC::random<T>(rng, dist);
52 while(index < Subscripts::size()-1)
54 auto pThetaE = pTheta(Subscripts(index));
62 pD.try_emplace(Subscripts(index), pRC::zero<T>());
63 pD[Subscripts(index)] += pRC::unit<T>();
65 pDSum += pRC::unit<decltype(pDSum)>();
69 for(
auto &[k, v] : pD)
89 template<
class T, pRC::Size D>
91 pRC::Size
const &size,
T const &toleranceSolverP)
94 pRC::SeedSequence seq(8, 16);
95 pRC::RandomEngine rng(seq);
97 return generatePD(rng, op, size, toleranceSolverP);
115 template<pRC::Size RP,
class T, pRC::Size D>
118 T const &toleranceSolverP)
121 decltype(expand(pRC::makeConstantSequence<pRC::Size, D, 2>(),
122 [](
auto const... seq)
124 return pRC::Subscripts<seq...>();
127 auto const pTheta = calculatePTheta<RP>(op, toleranceSolverP);
130 T maxHeuristic = pRC::zero();
131 for(pRC::Index i = 0; i < 1000; ++i)
133 auto const subscripts = getRandomSubscripts<Subscripts>();
134 auto const value = pTheta(subscripts);
135 if(value > maxHeuristic)
137 maxHeuristic = value;
142 T prefactor =
T(1) / maxHeuristic;
144 std::map<Subscripts, T> pD;
145 pRC::UnsignedInteger<64> pDSum = 0;
148 pRC::UniformDistribution<T> dist;
153 auto const subscripts = getRandomSubscripts<Subscripts>();
154 T const r = pRC::random<T>(rng, dist);
155 if(r < prefactor * pTheta(subscripts))
157 pD.try_emplace(subscripts, pRC::zero<T>());
158 pD[subscripts] += pRC::unit<T>();
159 pDSum += pRC::unit<decltype(pDSum)>();
165 for(
auto &[k, v] : pD)
186 template<pRC::Size RP,
class T, pRC::Size D>
188 pRC::Size
const &size,
T const &toleranceSolverP)
191 pRC::SeedSequence seq(8, 16);
192 pRC::RandomEngine rng(seq);
194 return generatePD<RP>(rng, op, size, toleranceSolverP);
Class storing an MHN operator represented by a theta matrix (for TT calculations)
Definition: mhn_operator.hpp:23
Class storing an MHN operator represented by a theta matrix (for non TT calculations)
Definition: mhn_operator.hpp:23
pRC::Float<> T
Definition: externs_nonTT.hpp:1
Definition: calculate_pTheta.hpp:15
static auto generatePD(pRC::RandomEngine &rng, nonTT::MHNOperator< T, D > const &op, pRC::Size const &size, T const &toleranceSolverP)
Generates a data distribution from a given nonTT MHNOperator.
Definition: generate_pD.hpp:28
X calculatePTheta(nonTT::MHNOperator< T, D > const &op, X const &pInit, T const &toleranceSolver)
Calculates the vector pTheta given a nonTT MHN Operator and a tolerance.
Definition: calculate_pTheta.hpp:33