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.
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/PKG-INFO +1 -1
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/replay_buffer.py +3 -2
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/replay_buffer_h5py.py +7 -2
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/pyproject.toml +4 -1
- memmap_replay_buffer-0.1.4/tests/test_mixed_storage.py +81 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/.gitignore +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/LICENSE +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/README.md +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/__init__.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/episode_collector.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_episode_collector.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_get_all_data.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_lazy_init.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_n_step.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_nstep_timestep_gotcha.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_replay_buffer.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_replay_buffer_h5py.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_scalar_flexibility.py +0 -0
- {memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_store_episode_parity.py +0 -0
- {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.
|
|
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
|
{memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/replay_buffer.py
RENAMED
|
@@ -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(
|
{memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/replay_buffer_h5py.py
RENAMED
|
@@ -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(
|
|
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.
|
|
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,)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/memmap_replay_buffer/episode_collector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_nstep_timestep_gotcha.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{memmap_replay_buffer-0.1.2 → memmap_replay_buffer-0.1.4}/tests/test_store_episode_parity.py
RENAMED
|
File without changes
|
|
File without changes
|