From aff0f9aee0fbef4e58fbc83a41f5864969bc492e Mon Sep 17 00:00:00 2001 From: Trinkle23897 <463003665@qq.com> Date: Sat, 20 Jun 2020 22:03:22 +0800 Subject: [PATCH] fix append batch over batch --- docs/_static/images/concepts_arch2.png | Bin 0 -> 30499 bytes docs/tutorials/concepts.rst | 6 ++++++ test/base/test_batch.py | 10 ++++++++++ tianshou/data/batch.py | 2 ++ 4 files changed, 18 insertions(+) create mode 100644 docs/_static/images/concepts_arch2.png diff --git a/docs/_static/images/concepts_arch2.png b/docs/_static/images/concepts_arch2.png new file mode 100644 index 0000000000000000000000000000000000000000..134bad337dd5095fd0b1e700c61cb92f1c6bbe1f GIT binary patch literal 30499 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 Pw-_plnhK?ICc*y$2(ho> literal 0 HcmV?d00001 diff --git a/docs/tutorials/concepts.rst b/docs/tutorials/concepts.rst index 6de15cc..b6db4f3 100644 --- a/docs/tutorials/concepts.rst +++ b/docs/tutorials/concepts.rst @@ -8,6 +8,12 @@ Tianshou splits a Reinforcement Learning agent training procedure into these par :height: 300 +Here is a more detailed description, where ``Env`` is the environment and ``Model`` is the neural network: + +.. image:: /_static/images/concepts_arch2.png + :align: center + :height: 300 + Data Batch ---------- diff --git a/test/base/test_batch.py b/test/base/test_batch.py index a278ff0..ab886dd 100644 --- a/test/base/test_batch.py +++ b/test/base/test_batch.py @@ -34,6 +34,16 @@ def test_batch_over_batch(): print(batch2) assert batch2.values()[-1] == batch2.c assert batch2[-1].b.b == 0 + batch2.append(Batch(c=[6, 7, 8], b=batch)) + assert batch2.c == [6, 7, 8, 6, 7, 8] + assert batch2.b.a == [3, 4, 5, 3, 4, 5] + assert batch2.b.b == [4, 5, 0, 4, 5, 0] + d = {'a': [3, 4, 5], 'b': [4, 5, 6]} + batch3 = Batch(c=[6, 7, 8], b=d) + batch3.append(Batch(c=[6, 7, 8], b=d)) + assert batch3.c == [6, 7, 8, 6, 7, 8] + assert batch3.b.a == [3, 4, 5, 3, 4, 5] + assert batch3.b.b == [4, 5, 6, 4, 5, 6] def test_batch_over_batch_to_torch(): diff --git a/tianshou/data/batch.py b/tianshou/data/batch.py index f498a4d..61d23d9 100644 --- a/tianshou/data/batch.py +++ b/tianshou/data/batch.py @@ -234,6 +234,8 @@ class Batch: self.__dict__[k] = torch.cat([self.__dict__[k], v]) elif isinstance(v, list): self.__dict__[k] += v + elif isinstance(v, Batch): + self.__dict__[k].append(v) else: s = f'No support for append with type \ {type(v)} in class Batch.'