asataura's picture
initial commit
6fa23b0
raw
history blame
2.18 kB
import numpy as np
from utilities.data_structures.Node import Node
class Deque(object):
"""Generic deque object"""
def __init__(self, max_size, dimension_of_value_attribute):
self.max_size = max_size
self.dimension_of_value_attribute = dimension_of_value_attribute
self.deque = self.initialise_deque()
self.deque_index_to_overwrite_next = 0
self.reached_max_capacity = False
self.number_experiences_in_deque = 0
def initialise_deque(self):
"""Initialises a queue of Nodes of length self.max_size"""
deque = np.array([Node(0, tuple([None for _ in range(self.dimension_of_value_attribute)])) for _ in range(self.max_size)])
return deque
def add_element_to_deque(self, new_key, new_value):
"""Adds an element to the deque and then updates the index of the next element to be overwritten and also the
amount of elements in the deque"""
self.update_deque_node_key_and_value(self.deque_index_to_overwrite_next, new_key, new_value)
self.update_number_experiences_in_deque()
self.update_deque_index_to_overwrite_next()
def update_deque_node_key_and_value(self, index, new_key, new_value):
self.update_deque_node_key(index, new_key)
self.update_deque_node_value(index, new_value)
def update_deque_node_key(self, index, new_key):
self.deque[index].update_key(new_key)
def update_deque_node_value(self, index, new_value):
self.deque[index].update_value(new_value)
def update_deque_index_to_overwrite_next(self):
"""Updates the deque index that we should write over next. When the buffer gets full we begin writing over
older experiences"""
if self.deque_index_to_overwrite_next < self.max_size - 1:
self.deque_index_to_overwrite_next += 1
else:
self.reached_max_capacity = True
self.deque_index_to_overwrite_next = 0
def update_number_experiences_in_deque(self):
"""Keeps track of how many experiences there are in the buffer"""
if not self.reached_max_capacity:
self.number_experiences_in_deque += 1