cMHN 1.0
C++ library for learning MHNs with pRC
generate_theta.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef cMHN_UTILITY_GENERATE_THETA_H
4#define cMHN_UTILITY_GENERATE_THETA_H
5
6#include <prc.hpp>
7
8namespace cMHN
9{
32 template<pRC::Size D, class T = pRC::Float<>>
33 static inline auto generateTheta(pRC::RandomEngine &rng,
34 pRC::Float<> const &fullness = 0.5, T const &diagonalMean = -2,
35 T const &diagonalStd = 2, T const &offDiagonalMean = 0,
36 T const &offDiagonalB = 0.75)
37 {
38 // diagonal
39 pRC::GaussianDistribution<T> diagonalDist(diagonalMean, diagonalStd);
40 auto diagonalTheta =
41 pRC::random<pRC::Tensor<T, D, D>>(rng, diagonalDist);
42
43 // off diagonal
44 pRC::LaplaceDistribution<T> offDiagonalDist(offDiagonalMean,
45 offDiagonalB);
46 auto offDiagonalTheta =
47 pRC::random<pRC::Tensor<T, D, D>>(rng, offDiagonalDist);
48
49 // combine both
50 auto theta =
51 eval(diagonal(diagonalTheta) + offDiagonal(offDiagonalTheta));
52
53 // add sparsity
54 pRC::UniformDistribution<pRC::Float<>> sparsityDist;
55 auto allowedPlaces = offDiagonal(
56 pRC::random<pRC::Tensor<pRC::Float<>, D, D>>(rng, sparsityDist));
57 for(pRC::Index i = 0; i < D; ++i)
58 {
59 for(pRC::Index j = 0; j < D; ++j)
60 {
61 if(allowedPlaces(i, j) > fullness)
62 {
63 theta(i, j) = pRC::zero();
64 }
65 }
66 }
67
68 return theta;
69 }
70
95 template<pRC::Size D, class T = pRC::Float<>>
96 static inline auto generateTheta(pRC::Float<> const &fullness = 0.5,
97 T const &diagonalMean = -2, T const &diagonalStd = 2,
98 T const &offDiagonalMean = 0, T const &offDiagonalB = 0.75)
99 {
100 // rng setup
101 pRC::SeedSequence seq(8, 16);
102 pRC::RandomEngine rng(seq);
103
104 return generateTheta<D>(rng, fullness, diagonalMean, diagonalStd,
105 offDiagonalMean, offDiagonalB);
106 }
107}
108
109#endif // cMHN_UTILITY_GENERATE_THETA_H
pRC::Size const D
Definition: CalculatePThetaTests.cpp:9
pRC::Float<> T
Definition: externs_nonTT.hpp:1
Definition: calculate_pTheta.hpp:15
static auto generateTheta(pRC::RandomEngine &rng, pRC::Float<> const &fullness=0.5, T const &diagonalMean=-2, T const &diagonalStd=2, T const &offDiagonalMean=0, T const &offDiagonalB=0.75)
Generates a random theta matrix according to given distributions, and with given fullness.
Definition: generate_theta.hpp:33