3#ifndef cMHN_NONTT_LEARN_THETA_H
4#define cMHN_NONTT_LEARN_THETA_H
51 template<
class T, pRC::Size D,
class S>
52 std::tuple<pRC::Tensor<T, D, D>,
53 std::map<std::string, std::string>,
54 std::map<std::string, double>>
56 std::string
const &header, std::string
const &output,
59 T const &toleranceSolverP,
T const &toleranceSolverQ)
61 auto tempTheta = theta;
63 auto score = pRC::zero<T>();
65 pRC::Index at_iter = 0;
67 pRC::Float<64> startTime = pRC::getTimeInSeconds();
69 std::map<std::string, double> logInfoNumbers{{
"Score", score()},
70 {
"Iterations", at_iter},
71 {
"Time", pRC::getTimeInSeconds()() - startTime()},
74 std::map<std::string, std::string> logInfoNames{
77 writeTheta(output, header, tempTheta, logInfoNames, logInfoNumbers);
79 std::cout <<
"cMHN learning started (nonTT):" << std::endl;
80 std::cout <<
"\tScore Name:\t" << logInfoNames[
"Score Name"]
82 std::cout <<
"\tRegulator Name:\t" << logInfoNames[
"Regulator Name"]
87 pRC::SeedSequence seq(8, 16);
88 pRC::RandomEngine rng(seq);
89 pRC::GaussianDistribution<pRC::Float<>> dist;
90 auto pInit = eval(expand(pRC::makeConstantSequence<pRC::Size, D, 2>(),
93 return pRC::random<pRC::Tensor<
T, Ns...>>(rng, dist);
95 pInit = pInit / norm(pInit);
97 tempTheta = pRC::optimize<pRC::Optimizer::BFGS<>>(
100 &toleranceOptimizer, &toleranceSolverP,
101 &toleranceSolverQ](
auto const &tempTheta,
auto &g)
113 for(
auto const &[k, v] : pD)
120 eval(expand(pRC::makeConstantSequence<pRC::Size, D, 2>(),
123 return pRC::zero<pRC::Tensor<
T, Ns...>>();
126 for(
auto const &[k, v] : pD)
131 auto q = pRC::solve<pRC::Solver::GMRES<>,
132 pRC::Operator::Transform::Transpose>(op, rhs,
133 pRC::zero<decltype(rhs)>(), toleranceSolverQ);
136 for(pRC::Index i = 0; i <
D; ++i)
138 auto r = hadamardProduct(q,
141 pRC::range<pRC::Context::CompileTime, D>(
146 g(i, j) = pRC::reduce<pRC::Add>(r)();
151 pRC::reduce<pRC::Add>(pRC::chip<j>(r, 1))();
161 [&output, &header, &score, &at_iter, &startTime, &logInfoNames,
162 &logInfoNumbers](
auto const &tempTheta)
164 logInfoNumbers[
"Iterations"] = at_iter;
165 logInfoNumbers[
"Score"] = score();
166 logInfoNumbers[
"Time"] =
167 pRC::getTimeInSeconds()() - startTime();
169 std::cout <<
"cMHN learning in progress (nonTT):" << std::endl;
170 std::cout << std::defaultfloat;
171 std::cout <<
"\tIteration:\t" << logInfoNumbers[
"Iterations"]
173 std::cout << std::scientific;
174 std::cout <<
"\tLambda:\t\t" << logInfoNumbers[
"Lambda"]
176 std::cout <<
"\tScore:\t\t" << logInfoNumbers[
"Score"]
178 std::cout <<
"\tTime:\t\t" << logInfoNumbers[
"Time"]
180 std::cout << std::defaultfloat;
182 writeTheta(output, header, tempTheta, logInfoNames,
188 return std::make_tuple(tempTheta, logInfoNames, logInfoNumbers);
pRC::Size const D
Definition: CalculatePThetaTests.cpp:9
Class storing all relevant information for a regulator.
Definition: regulator.hpp:30
auto & lambda()
Definition: regulator.hpp:58
auto grad(pRC::Tensor< T, D, D > const &theta) const
Definition: regulator.hpp:53
auto name() const
Definition: regulator.hpp:68
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 name() const
Definition: score.hpp:54
auto pointwiseDSDP(T const &pDE, T const &pThetaE) const
Definition: score.hpp:49
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: learn_theta.hpp:20
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
std::tuple< pRC::Tensor< T, D, D >, std::map< std::string, std::string >, std::map< std::string, double > > learnTheta(pRC::Tensor< T, D, D > const &theta, std::string const &header, std::string const &output, std::map< S, T > const &pD, cMHN::Score< T > const &Score, cMHN::Regulator< T, D > const &Regulator, T const &toleranceOptimizer, T const &toleranceSolverP, T const &toleranceSolverQ)
Optimizes an MHN represented by a theta matrix to best describe a given data distribution.
Definition: learn_theta.hpp:55
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
static auto writeTheta(std::string const &filename, std::string const &header, pRC::Tensor< T, D, D > const &theta, std::map< std::string, std::string > const &logInfoNames={}, std::map< std::string, double > const &logInfoNumbers={})
Writes a theta matrix to file, including additional logging information at the bottom.
Definition: write_theta.hpp:29