void blockAppend()

in csrc/liars_dice/rela/prioritized_replay.h [59:96]


  void blockAppend(const std::vector<DataType>& block,
                   const torch::Tensor& weights) {
    int blockSize = block.size();

    std::unique_lock<std::mutex> lk(m_);
    cvSize_.wait(lk,
                 [=] { return size_ + blockSize <= capacity && allow_write_; });

    int start = tail_;
    int end = (tail_ + blockSize) % capacity;

    tail_ = end;
    size_ += blockSize;
    checkSize(head_, tail_, size_);

    lk.unlock();

    float sum = 0;
    auto weightAcc = weights.accessor<float, 1>();
    assert(weightAcc.size(0) == blockSize);
    for (int i = 0; i < blockSize; ++i) {
      int j = (start + i) % capacity;
      elements_[j] = block[i];
      weights_[j] = weightAcc[i];
      sum += weightAcc[i];
    }

    lk.lock();

    cvTail_.wait(lk, [=] { return safeTail_ == start; });
    safeTail_ = end;
    safeSize_ += blockSize;
    sum_ += sum;
    checkSize(head_, safeTail_, safeSize_);

    lk.unlock();
    cvTail_.notify_all();
  }