fixed_capacity_vector get_questions()

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;
    }