memmap-replay-buffer 0.1.2__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/PKG-INFO +1 -1
  2. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/replay_buffer.py +3 -2
  3. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/replay_buffer_h5py.py +7 -2
  4. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/pyproject.toml +4 -1
  5. memmap_replay_buffer-0.1.4/tests/test_mixed_storage.py +81 -0
  6. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/.gitignore +0 -0
  7. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/LICENSE +0 -0
  8. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/README.md +0 -0
  9. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/__init__.py +0 -0
  10. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/episode_collector.py +0 -0
  11. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_episode_collector.py +0 -0
  12. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_get_all_data.py +0 -0
  13. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_lazy_init.py +0 -0
  14. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_n_step.py +0 -0
  15. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_nstep_timestep_gotcha.py +0 -0
  16. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_replay_buffer.py +0 -0
  17. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_replay_buffer_h5py.py +0 -0
  18. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_scalar_flexibility.py +0 -0
  19. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_store_episode_parity.py +0 -0
  20. {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_uint8_storage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memmap-replay-buffer
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Simple Replay Buffer for RL
5
5
  Project-URL: Homepage, https://pypi.org/project/memmap-replay-buffer/
6
6
  Project-URL: Repository, https://codeberg.org/lucidrains/memmap-replay-buffer
@@ -988,7 +988,8 @@ class ReplayBuffer:
988
988
  def get_all_data(
989
989
  self,
990
990
  fields: tuple[str, ...] | None = None,
991
- meta_fields: tuple[str, ...] | None = None
991
+ meta_fields: tuple[str, ...] | None = None,
992
+ device: torch.device | str | None = None
992
993
  ):
993
994
  self.flush()
994
995
 
@@ -1018,7 +1019,7 @@ class ReplayBuffer:
1018
1019
  memmap = self.meta_data[name]
1019
1020
  all_data[name] = from_numpy(memmap[:n].copy())
1020
1021
 
1021
- return all_data
1022
+ return tree_map_to_device(all_data, device)
1022
1023
 
1023
1024
  @beartype
1024
1025
  def dataset(
@@ -582,7 +582,12 @@ class ReplayBufferH5PY:
582
582
  self.timestep_index = time_dim
583
583
  self.advance_episode()
584
584
 
585
- def get_all_data(self, fields = None, meta_fields = None):
585
+ def get_all_data(
586
+ self,
587
+ fields = None,
588
+ meta_fields = None,
589
+ device: torch.device | str | None = None
590
+ ):
586
591
  self.flush()
587
592
 
588
593
  n = self.num_episodes
@@ -606,7 +611,7 @@ class ReplayBufferH5PY:
606
611
  for name in meta_data_fields:
607
612
  all_data[name] = from_numpy(self.meta_data[name][:n])
608
613
 
609
- return all_data
614
+ return tree_map_to_device(all_data, device)
610
615
 
611
616
  @beartype
612
617
  def dataset(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "memmap-replay-buffer"
3
- version = "0.1.2"
3
+ version = "0.1.4"
4
4
  description = "Simple Replay Buffer for RL"
5
5
  authors = [
6
6
  { name = "Phil Wang", email = "lucidrains@gmail.com" }
@@ -47,6 +47,9 @@ test = [
47
47
  pythonpath = [
48
48
  "."
49
49
  ]
50
+ testpaths = [
51
+ "tests"
52
+ ]
50
53
 
51
54
  [build-system]
52
55
  requires = ["hatchling"]
@@ -0,0 +1,81 @@
1
+ import pytest
2
+ import shutil
3
+ import torch
4
+ from pathlib import Path
5
+
6
+ from memmap_replay_buffer import ReplayBuffer
7
+
8
+ h5py = pytest.importorskip("h5py")
9
+ from memmap_replay_buffer import ReplayBufferH5PY
10
+
11
+
12
+ @pytest.fixture(params = [ReplayBuffer, ReplayBufferH5PY], ids = ['memmap', 'h5py'])
13
+ def buffer(request, tmp_path):
14
+ buffer_class = request.param
15
+ folder = tmp_path / f'mixed_storage_{buffer_class.__name__}'
16
+
17
+ buf = buffer_class(
18
+ folder,
19
+ max_episodes = 5,
20
+ max_timesteps = 10,
21
+ fields = dict(
22
+ state = 'float',
23
+ action = 'int'
24
+ ),
25
+ meta_fields = dict(
26
+ text_embedding = ('float', 4),
27
+ goal_id = 'int'
28
+ )
29
+ )
30
+
31
+ yield buf
32
+
33
+ if folder.exists():
34
+ shutil.rmtree(folder)
35
+
36
+
37
+ def test_store_episode_mixed(buffer):
38
+ buffer.store_episode(
39
+ state = torch.randn(5),
40
+ action = torch.ones(5),
41
+ text_embedding = torch.randn(4),
42
+ goal_id = 1
43
+ )
44
+
45
+ buffer.store_episode(
46
+ state = torch.randn(3),
47
+ action = torch.zeros(3),
48
+ text_embedding = torch.randn(4),
49
+ goal_id = 2
50
+ )
51
+
52
+ assert buffer.num_episodes == 2
53
+
54
+
55
+ def test_dataloader_mixed(buffer):
56
+ buffer.store_episode(
57
+ state = torch.randn(5),
58
+ action = torch.ones(5),
59
+ text_embedding = torch.randn(4),
60
+ goal_id = 1
61
+ )
62
+
63
+ buffer.store_episode(
64
+ state = torch.randn(3),
65
+ action = torch.zeros(3),
66
+ text_embedding = torch.randn(4),
67
+ goal_id = 2
68
+ )
69
+
70
+ loader = buffer.dataloader(
71
+ batch_size = 2,
72
+ timestep_level = True,
73
+ shuffle = False
74
+ )
75
+
76
+ batch = next(iter(loader))
77
+
78
+ assert 'state' in batch
79
+ assert 'text_embedding' in batch
80
+ assert batch['text_embedding'].shape == (2, 4)
81
+ assert batch['goal_id'].shape == (2,)