from collections import deque from log import log class Agenda(deque): def __init__(self, tokens_length, options, edges=None): # hrany by šly ukládat i do defaultdict # klíčem by bylo str() a hodnotou počet výskytů anebo # seznam rodičů – nerozlišuju způsob vytvoření! super().__init__() # na http://code.activestate.com/recipes/528878/ ukládají data do klíčů # slovníku, kde hodnoty tvoří oboustranně spojovaný seznam # nezrychlilo se to :-( self.known_edges = [[] for _ in range(tokens_length + 1)] for begin, lengths in enumerate(self.known_edges): lengths.extend(set() for _ in range(tokens_length + 1 - begin)) self.print_edges = options['edges'] if edges is not None: for edge in edges: self.append(edge) def append(self, edge): if edge not in self.known_edges[edge.begin][edge.length]: super().append(edge) self.known_edges[edge.begin][edge.length].add(edge) if self.print_edges: log.info(edge.how_created, edge) elif self.print_edges and not edge.how_created.startswith('predict'): log.warning(edge.how_created, edge) def popleft(self): edge = super().popleft() if self.print_edges: log.info(' %s', edge) return edge