3#ifndef cMHN_COMMON_CALCULATE_SCORE_AND_GRADIENT_H
4#define cMHN_COMMON_CALCULATE_SCORE_AND_GRADIENT_H
33 template<
class T, pRC::Size D,
class S>
34 std::tuple<T, pRC::Tensor<T, D, D>>
38 T const &toleranceSolverQ = 1e-4)
40 T score = pRC::zero();
41 pRC::Tensor<T, D, D> g = pRC::zero();
44 pRC::SeedSequence seq(8, 16);
45 pRC::RandomEngine rng(seq);
46 pRC::GaussianDistribution<pRC::Float<>> dist;
47 auto pInit = eval(expand(pRC::makeConstantSequence<pRC::Size, D, 2>(),
50 return pRC::random<pRC::Tensor<
T, Ns...>>(rng, dist);
52 pInit = pInit / norm(pInit);
56 for(
auto const &[k, v] : pD)
63 eval(expand(pRC::makeConstantSequence<pRC::Size, D, 2>(),
66 return pRC::zero<pRC::Tensor<
T, Ns...>>();
69 for(
auto const &[k, v] : pD)
74 auto const q = pRC::solve<pRC::Solver::GMRES<>,
75 pRC::Operator::Transform::Transpose>(op, rhs,
76 pRC::zero<decltype(rhs)>(), toleranceSolverQ);
79 for(pRC::Index i = 0; i <
D; ++i)
81 auto r = hadamardProduct(q,
84 pRC::range<pRC::Context::CompileTime, D>(
89 g(i, j) = pRC::reduce<pRC::Add>(r)();
93 g(i, j) = pRC::reduce<pRC::Add>(pRC::chip<j>(r, 1))();
101 return std::make_tuple(score, g);
120 template<pRC::Size RP, pRC::Size RQ,
class T, pRC::Size D,
class S>
121 std::tuple<T, pRC::Tensor<T, D, D>>
125 T const &toleranceSolverQ = 1e-4)
127 using ModeSizes =
decltype(TT::getModeSizes<D>());
128 using Ranks =
decltype(TT::getRanks<D, RP>());
130 T score = pRC::zero();
131 pRC::Tensor<T, D, D> g = pRC::zero();
134 pRC::SeedSequence seq(8, 16);
135 pRC::RandomEngine rng(seq);
136 pRC::GaussianDistribution<pRC::Float<>> dist;
137 auto pInit = round<Ranks>(
138 pRC::random<pRC::TensorTrain::Tensor<T, ModeSizes, Ranks>>
140 pInit /= scalarProduct(pInit,
141 pRC::unit<pRC::TensorTrain::Tensor<T, ModeSizes>>())();
144 calculatePTheta<RP>(op, pInit, toleranceSolverP);
146 T scoreT = pRC::zero();
147 pRC::Tensor<T, D, D> gT = pRC::zero();
149 #pragma omp declare reduction(+: T, pRC::Tensor<T, D, D>: omp_out = omp_in + omp_out) \
150 initializer (omp_priv(pRC::Zero()))
151 #pragma omp parallel for schedule(dynamic, 10) reduction(+ : scoreT, gT)
153 for(pRC::Index s = 0; s < pD.size(); ++s)
155 auto it = pD.cbegin();
157 auto const [k, v] = *it;
158 auto const pThetaE = pTheta(k);
163 pRC::TensorTrain::Tensor<T, ModeSizes>::Single(
164 pRC::identity<T>(), k);
167 auto const q = TT::ALS<RQ, pRC::Operator::Transform::Transpose>(
168 op, rhs, toleranceSolverQ);
170 pRC::Tensor<T, D, D> tmp = pRC::zero();
171 for(pRC::Index i = 0; i <
D; ++i)
173 for(pRC::Index j = 0; j <
D; ++j)
176 scalarProduct(q, op.
derivative(i, j) * pTheta)();
184 return std::make_tuple(score, g);
pRC::Size const D
Definition: CalculatePThetaTests.cpp:9
Class storing all relevant information for a regulator.
Definition: regulator.hpp:30
auto grad(pRC::Tensor< T, D, D > const &theta) const
Definition: regulator.hpp:53
auto score(pRC::Tensor< T, D, D > const &theta) const
Definition: regulator.hpp:48
Class storing all relevant information for a score.
Definition: score.hpp:27
auto pointwiseScore(T const &pDE, T const &pThetaE) const
Definition: score.hpp:44
auto pointwiseDSDP(T const &pDE, T const &pThetaE) const
Definition: score.hpp:49
Class storing an MHN operator represented by a theta matrix (for TT calculations)
Definition: mhn_operator.hpp:23
constexpr auto & theta(pRC::Index const i, pRC::Index const j) const
Definition: mhn_operator.hpp:33
constexpr auto derivative(pRC::Index const i, pRC::Index const j) const
Definition: mhn_operator.hpp:76
Class storing an MHN operator represented by a theta matrix (for non TT calculations)
Definition: mhn_operator.hpp:23
constexpr auto & theta(pRC::Index const i, pRC::Index const j) const
Definition: mhn_operator.hpp:33
pRC::Float<> T
Definition: externs_nonTT.hpp:1
static constexpr auto applyDerivative(MHNOperator< T1, D > const &op, pRC::Tensor< T2, Ns... > const &x, pRC::Index const &i)
apply the derivative of an MHN Q wrt to theta_ii to a vector x
Definition: mhn_operator.hpp:71
Definition: calculate_pTheta.hpp:15
std::tuple< T, pRC::Tensor< T, D, D > > calculateScoreAndGradient(nonTT::MHNOperator< T, D > const &op, std::map< S, T > const &pD, cMHN::Score< T > const &Score, cMHN::Regulator< T, D > const &Regulator, T const &toleranceSolverP=1e-4, T const &toleranceSolverQ=1e-4)
Calculate score and gradient of a theta matrix given some data distribution pD.
Definition: calculate_score_and_gradient.hpp:35
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