in csrc/InfoBot.cc [988:1051]
fixed_capacity_vector<Question, 2*MAXHANDSIZE> get_questions(int total_info, const GameView& view, const HandInfo& hand_info) const {
fixed_capacity_vector<Question, 2*MAXHANDSIZE> questions;
int info_remaining = total_info;
auto add_question = [&](Question question) {
info_remaining /= question.info_amount();
questions.emplace_back(std::move(question));
return info_remaining <= 1;
};
fixed_capacity_vector<AugmentedCardPossibilities, MAXHANDSIZE> augmented_hand_info;
bool any_known_playable = false;
for (int i=0; i < (int)hand_info.size(); ++i) {
augmented_hand_info.emplace_back(hand_info[i], i, view);
if (augmented_hand_info.back().p_play == 1.0) {
any_known_playable = true;
}
}
if (!any_known_playable) {
fixed_capacity_vector<AugmentedCardPossibilities, MAXHANDSIZE> ask_play;
for (auto&& knol : augmented_hand_info) {
if (knol.is_determined) continue;
if (knol.p_dead == 1.0) continue;
if (knol.p_play == 1.0 || knol.p_play < 0.2) continue;
ask_play.emplace_back(knol);
}
// sort by probability of play, then by index
std::sort(ask_play.begin(), ask_play.end(), [](auto&& a, auto&& b) {
// *higher* probabilities are better
if (a.p_play != b.p_play) return (a.p_play > b.p_play);
return (a.i < b.i);
});
for (const auto& knol : ask_play) {
auto q = Question::IsPlayable(knol.i);
if (add_question(std::move(q))) {
return questions;
}
}
}
fixed_capacity_vector<AugmentedCardPossibilities, MAXHANDSIZE> ask_partition;
for (auto&& knol : augmented_hand_info) {
if (knol.is_determined) continue;
// TODO: possibly still valuable to ask?
if (knol.p_dead == 1.0) continue;
ask_partition.emplace_back(knol);
}
// sort by probability of play, then by index
std::sort(ask_partition.begin(), ask_partition.end(), [](auto&& a, auto&& b) {
// *higher* probabilities are better
return std::tie(b.p_play, a.i) < std::tie(a.p_play, b.i);
});
for (const auto& knol : ask_partition) {
auto q = Question::CardPossibilityPartition(knol.i, info_remaining, knol.card_table, view);
if (add_question(std::move(q))) {
return questions;
}
}
return questions;
}