53 std::set<DiscreteKey> discreteProbsKeySet =
55 std::set<DiscreteKey> conditionalKeySet =
58 auto pruner = [prunedDiscreteProbs, discreteProbsKeySet, conditionalKeySet](
60 double probability) ->
double {
62 double pruned_prob = 0.0;
68 if (conditionalKeySet == discreteProbsKeySet) {
69 if (prunedDiscreteProbs(
values) == 0) {
77 std::set<Key> valuesKeys;
79 valuesKeys.insert(kvp.first);
81 std::set<Key> conditionalKeys;
82 for (
auto kvp : conditionalKeySet) {
83 conditionalKeys.insert(kvp.first);
86 if (conditionalKeys != valuesKeys) {
88 std::vector<Key> missing_keys;
89 std::set_difference(conditionalKeys.begin(), conditionalKeys.end(),
90 valuesKeys.begin(), valuesKeys.end(),
91 std::back_inserter(missing_keys));
93 for (
auto missing_key : missing_keys) {
101 std::vector<DiscreteKey> set_diff;
102 std::set_difference(discreteProbsKeySet.begin(),
103 discreteProbsKeySet.end(), conditionalKeySet.begin(),
104 conditionalKeySet.end(),
105 std::back_inserter(set_diff));
108 const std::vector<DiscreteValues> assignments =
112 augmented_values.
insert(assignment);
116 if (prunedDiscreteProbs(augmented_values) > 0.0) {
130 size_t maxNrLeaves) {
135 std::vector<size_t> discrete_factor_idxs;
139 for (
size_t i = 0;
i < this->
size();
i++) {
140 auto conditional = this->
at(
i);
141 if (conditional->isDiscrete()) {
142 discreteProbs = discreteProbs * (*conditional->asDiscrete());
144 Ordering conditional_keys(conditional->frontals());
145 discrete_frontals += conditional_keys;
146 discrete_factor_idxs.push_back(
i);
151 discreteProbs.
prune(maxNrLeaves);
158 for (
size_t i = 0;
i < discrete_factor_idxs.size();
i++) {
159 size_t idx = discrete_factor_idxs.at(
i);
160 this->
at(idx) = std::make_shared<HybridConditional>(dbn->at(
i));
163 return prunedDiscreteProbs;
182 for (
auto &&conditional : *
this) {
183 if (
auto gm = conditional->asMixture()) {
185 auto prunedGaussianMixture = std::make_shared<GaussianMixture>(*gm);
186 prunedGaussianMixture->prune(prunedDiscreteProbs);
189 prunedBayesNetFragment.
push_back(prunedGaussianMixture);
193 prunedBayesNetFragment.
push_back(conditional);
197 return prunedBayesNetFragment;
204 for (
auto &&conditional : *
this) {
205 if (
auto gm = conditional->asMixture()) {
207 gbn.push_back((*gm)(assignment));
208 }
else if (
auto gc = conditional->asGaussian()) {
211 }
else if (
auto dc = conditional->asDiscrete()) {
224 for (
auto &&conditional : *
this) {
225 if (conditional->isDiscrete()) {
226 discrete_bn.
push_back(conditional->asDiscrete());
243 if (std::find(
gbn.begin(),
gbn.end(),
nullptr) !=
gbn.end()) {
246 return gbn.optimize();
251 std::mt19937_64 *
rng)
const {
253 for (
auto &&conditional : *
this) {
254 if (conditional->isDiscrete()) {
256 dbn.
push_back(conditional->asDiscrete());
265 return {
sample, assignment};
290 for (
auto &&conditional : *
this) {
291 if (
auto gm = conditional->asMixture()) {
295 }
else if (
auto gc = conditional->asGaussian()) {
297 double error = gc->error(continuousValues);
300 [
error](
double leaf_value) {
return leaf_value +
error; });
302 }
else if (
auto dc = conditional->asDiscrete()) {
320 for (
auto &&conditional : *
this) {
321 if (
auto gm = conditional->asMixture()) {
325 }
else if (
auto gc = conditional->asGaussian()) {
334 }
else if (
auto dc = conditional->asDiscrete()) {
338 return leaf_value + dc->logProbability(
DiscreteValues(assignment));
365 for (
auto &&conditional : *
this) {
366 if (conditional->frontalsIn(measurements)) {
367 if (
auto gc = conditional->asGaussian()) {
368 fg.
push_back(gc->likelihood(measurements));
369 }
else if (
auto gm = conditional->asMixture()) {
370 fg.
push_back(gm->likelihood(measurements));
372 throw std::runtime_error(
"Unknown conditional type");