void JointSearchBot::updateFrames_()

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