1#ifndef FREE_TENSOR_RAND_CTX_H
2#define FREE_TENSOR_RAND_CTX_H
8#include <unordered_map>
23#define PROGRAM_POSITION \
24 ([]() -> ProgramPosition { \
25 static ProgramPositionHelper p; \
43 std::unordered_map<ProgramPosition, Ref<std::vector<int>>>
totCnt_;
45 std::multimap<Ref<RandTrace>, std::pair<double, double>,
101template <std::uniform_random_bit_generator RNG>
120 const std::string &message =
"") {
121 std::lock_guard<std::mutex> guard(
lock_);
128 auto &&totCnt =
totCnt_.at(pos);
130 std::vector<double> prob{totCnt->begin(), totCnt->end()};
131 for (
auto it = condStack; !it.
empty(); it = it.pop()) {
132 auto &&cond = it.top();
134 std::vector<int> initObs;
135 initObs.reserve(priori.size());
136 for (
auto &&p : priori) {
137 initObs.emplace_back((
int)(INIT_OBS * p));
143 auto localProb = var->prob();
144 for (
auto &&[p, q] : views::zip(prob, localProb)) {
151 value = std::max_element(prob.begin(), prob.end()) - prob.begin();
154 std::discrete_distribution<int>(prob.begin(), prob.end())(rng_);
158 std::vector<Ref<DiscreteRandVar>> vars;
159 for (
auto it = condStack; !it.
empty(); it = it.pop()) {
160 auto &&cond = it.top();
162 vars.emplace_back(var);
164 trace->emplace_back(vars, totCnt, value, message);
Definition: func_utils.h:9
Definition: rand_ctx.h:34
std::regex toLearn_
Definition: rand_ctx.h:50
std::mutex lock_
Definition: rand_ctx.h:52
void setLearnFilter(const std::regex &toLearn)
Definition: rand_ctx.h:76
bool isInfer_
Definition: rand_ctx.h:49
void setLearn()
Definition: rand_ctx.h:83
void observeTrace(const Ref< RandTrace > &trace, double value, double stddev)
Definition: rand_ctx.cc:5
void setInfer()
Definition: rand_ctx.h:90
std::unordered_map< ProgramPosition, std::unordered_map< Ref< RandCondInterface >, Ref< DiscreteRandVar >, PtrInvocable< std::hash< RandCondInterface > >, PtrInvocable< std::equal_to< RandCondInterface > > > > randVars_
Definition: rand_ctx.h:41
std::unordered_map< ProgramPosition, Ref< std::vector< int > > > totCnt_
Definition: rand_ctx.h:43
std::multimap< Ref< RandTrace >, std::pair< double, double >, PtrInvocable< std::less< RandTrace > > > traces_
Definition: rand_ctx.h:47
Definition: rand_ctx.h:102
RandCtx(RNG &rng)
Definition: rand_ctx.h:106
int decide(ProgramPosition pos, const std::string &name, const RandCondStack &condStack, const std::vector< double > &priori, const Ref< RandTrace > &trace, const std::string &message="")
Definition: rand_ctx.h:117
static Ref make()
Definition: ref.h:105
bool isValid() const
Definition: ref.h:89
Definition: shared_linked_list.h:21
bool empty() const
Definition: shared_linked_list.h:36
Definition: allocator.h:9
const ProgramPositionHelper * ProgramPosition
Definition: rand_ctx.h:18
std::vector< DiscreteObservation > RandTrace
Definition: rand_ctx.h:29
Definition: rand_ctx.h:17