Skip to content
Snippets Groups Projects
base.py 3.19 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jarrod Pas's avatar
    Jarrod Pas committed
    from collections import defaultdict
    from itertools import product
    
    import networkx as nx
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    from pydyton.core import TickProcess
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
    class EpochCommunity(TickProcess):
    
    Jarrod Pas's avatar
    Jarrod Pas committed
        def __init__(self, epoch, **kwargs):
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            super().__init__(epoch)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
            self.graph = nx.Graph()
            self.old_graph = None
            self.community = defaultdict(frozenset)
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
            self.__cbc_memo = {}
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
        def set_link(self, a, b, state, now):
            if a not in self.graph:
                self.graph.add_node(a)
    
            if b not in self.graph:
                self.graph.add_node(b)
    
            if b not in self.graph[a]:
                self.graph.add_edge(a, b, { 'start': -1 })
    
            edge = self.graph[a][b]
            if state:
                edge['start'] = now
                if 'duration' not in edge:
                    edge['duration'] = 0
            else:
                edge['duration'] = now - edge['start']
                edge['start'] = -1
    
        def next_epoch(self, now):
            self.community = defaultdict(frozenset)
            edges_to_keep = []
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            self.__cbc_memo = {}
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
            for a, b, start in self.graph.edges(data='start'):
                if start > -1:
                    self.set_link(a, b, False, now)
                    edges_to_keep.append((a, b))
    
            self.old_graph = self.graph
            self.graph = nx.Graph()
            for a, b in edges_to_keep:
                self.set_link(a, b, True, now)
    
            return self.old_graph
    
        def __getitem__(self, node):
            return self.community[node]
    
        def get_lp(self, node):
            '''local popularity of a node'''
            if node not in self.old_graph:
                return 0
    
            edges = self.old_graph[node]
            community = self[node]
            return sum([
                edge['duration']
                for other, edge in edges.items()
                if other in community
            ])
    
        def get_gp(self, node):
            '''global popularity of a node'''
            if node not in self.old_graph:
                return 0
    
    
            edges = self.old_graph[node]
            community = self[node]
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            return sum([
                edge['duration']
                for other, edge in edges.items()
                if other not in community
            ])
    
        def get_ui(self, node):
            '''unique interactions with a node'''
            if node not in self.old_graph:
                return 0
    
            edges = self.old_graph[node]
            community = self[node]
            return len([
                other
                for other in edges
                if other in community
            ])
    
        def get_cbc(self, a, b):
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            ''''''
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            g = self.old_graph
            c_x = self[a]
            c_y = self[b]
            memo = (c_x, c_y)
    
            if a not in g or b not in g or c_x == c_y:
                return 0
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            if memo in self.__cbc_memo:
                return self.__cbc_memo[memo]
    
    Jarrod Pas's avatar
    Jarrod Pas committed
    
            cbc = sum([
                g[x][y]['duration']
                for x, y in product(c_x, c_y)
                if y in g[x]
            ])
    
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            self.__cbc_memo[memo] = cbc
            self.__cbc_memo[(memo[1], memo[0])] = cbc
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            return cbc
    
        def get_ncf(self, x, b):
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            ''''''
    
    Jarrod Pas's avatar
    Jarrod Pas committed
            g = self.old_graph
            c_y = self[b]
    
            if x not in g or b not in g:
                return 0
    
            return sum([
                g[x][y]['duration']
                for y in c_y
                if y in g[x]
            ])