in csrc/JointSearchBot.cc [270:366]
void JointSearchBot::updateFrames_(int who, const Server &server) {
auto &history = history_[who];
int init_num_frames = history.size();
int from = 1 - who;
std::cerr << now() << "(P" << me_ << ") updateFrames_ P " << who << ": " << history.size() << " frames." << std::endl;
while (history.size() > 0) {
auto &frame = history[0];
auto &hand_dist = frame.hand_dist_;
if (RANGE_MAX >= 0 && hand_dist.size() > RANGE_MAX) {
break;
}
// alright! we can do an update!
auto &frame_simulserver = frame.simulserver_;
assert(frame_simulserver.numPlayers() == 2);
std::cerr << now() << " Frame " << frame.frame_idx_
<< " : Looking for hands for P " << who
<< " consistent with P " << from << " action " << frame.move_.toString()
<< " (range= " << frame.hand_dist_.size() << " , partner range= " << frame.partner_hand_dist_.size() << " )" << std::endl;
auto memoize_key = std::tie(from, frame.frame_idx_);
if (memoizedRange.count(memoize_key)) {
std::cerr << now() << "Using memoized values to update frame " << frame.frame_idx_ << std::endl;
auto &my_memoized_range = memoizedRange[memoize_key];
for (auto &hand : my_memoized_range) {
assert(hand_dist.count(hand));
hand_dist.erase(hand);
propagatePrunedHand_(who, 0, hand);
}
std::cerr << now() << " Filtered historical range down to " << hand_dist.size() << " (MEMOIZED) " << std::endl;
checkBeliefs_(server);
history.erase(history.begin());
continue;
}
auto hand_dist_keys = copyKeys(hand_dist);
std::vector<Hand> my_memoized_range;
std::cerr << now() << "Applying delayed obs on my hand dist..." << std::endl;
applyDelayedObservations(hand_dist, hand_dist_keys);
std::cerr << now() << "Applying delayed obs on partner dist..." << std::endl;
applyDelayedObservations(frame.partner_hand_dist_, copyKeys(frame.partner_hand_dist_));
std::cerr << now() << "Done delayed updates." << std::endl;
HandDistCDF public_pdf = populateHandDistPDF(frame.partner_hand_dist_);
HandDistCDF private_cdf = populateHandDistPDF(frame.partner_hand_dist_); // not done
for (int i = 0; i < hand_dist_keys.size(); i++) {
const Hand &hand = hand_dist_keys[i];
auto &distval = hand_dist[hand];
SimulServer my_server(frame_simulserver);
my_server.setHand(who, hand);
assert(my_server.whoAmI() == frame_simulserver.whoAmI());
auto from_bot = distval.getPartner(from);
Move bp_move = my_server.simulatePlayerMove(from, from_bot.get());
my_server.setObservingPlayer(from); // so that we copy over who's hand in sync()
// size_t num_private_beliefs = constructPrivateBeliefs_(hand, frame.partner_hand_dist_, partner_private_beliefs, my_server);
size_t num_private_beliefs = constructPrivateBeliefs_(
hand, public_pdf, private_cdf, my_server);
if (num_private_beliefs == 0) {
// std::cerr << now() << "Removed " << handAsString(hand) << " because inconsistent with partner beliefs" << std::endl << std::flush;
continue;
}
pdfToCdf(private_cdf, private_cdf);
std::mt19937 search_gen(JOINT_SEARCH_SEED); // coordinate on seed yuck
SearchStats stats;
// move = doSearch_(me_, bp_move, players_[me_].get(), my_private_beliefs, stats, search_gen, server);
Move cf_move = doSearch_(from, bp_move, frame.move_, from_bot.get(), frame.partner_hand_dist_, private_cdf, stats, search_gen, my_server, false);
// std::cerr << now() << " Hand= " << handAsString(hand)
// << " true_move= " << frame.move_.toString() << " (score= " << stats[frame.move_].mean
// << " ) pred_move= " << cf_move.toString() << " (score= " << stats[cf_move].mean << " )" << std::endl;
if (frame.move_ != cf_move) {
hand_dist.erase(hand);
if(MEMOIZE_RANGE_SEARCH) {
my_memoized_range.push_back(hand);
}
// std::cerr << now() << " Gonna propagate pruning of hand " << handAsString(hand) << " ; current beliefs contain " << hand_dists_[who].size() << std::endl;
propagatePrunedHand_(who, 0, hand);
// std::cerr << now() << " post-pruned beliefs contain " << hand_dists_[who].size() << std::endl;
checkBeliefs_(server);
}
}
if (MEMOIZE_RANGE_SEARCH) {
memoizedRange[memoize_key] = my_memoized_range;
}
std::cerr << now() << " Filtered historical range down to " << hand_dist.size() << std::endl;
checkBeliefs_(server);
history.erase(history.begin()); // FIXME: use more efficient data structure or use SmartPtr to avoid copies
if (history.size() == 0) {
std::cerr << now() << "Woo! pushed up to the present!" << std::endl;
}
}
if (init_num_frames != history.size()) std::cerr << now() << "updateFrames_ reduced history from " << init_num_frames << " to " << history.size() << " frames." << std::endl;
std::cerr << now() << "updateFrames_ done." << std::endl;
}