#pragma once // The InputBuffer class accumulates a list of Variables for use by a // function. It implements logic to avoid modifying the passed // values in-place (adding an input twice will accumulate the result). // This behaviour is needed and used only in backward graphs. #include #include #include #include #include #include #include namespace torch { namespace autograd { struct InputBuffer { explicit InputBuffer(size_t size) : buffer(size) {} InputBuffer(const InputBuffer& other) = delete; InputBuffer(InputBuffer&& other) = default; InputBuffer& operator=(InputBuffer&& other) = default; // Accumulates the variable at a specified index. // The optional CUDA streams determine which stream the accumulation // is run on and how the addition is synchronized. void add(size_t pos, Variable&& var, const c10::optional& opt_producer_stream, const c10::optional& opt_consumer_stream); at::Device device() const; Variable operator[](size_t pos) { return buffer[pos]; } // Returns the inputs as a list of variables. Destroys given InputBuffer. static std::vector variables(InputBuffer&& g); private: std::vector buffer; }; }} // namespace torch::autograd