Example #1
0
 def deltas_from(self, g, old_d, node):
     node_a = old_d.get(node, 0.0)
     if abs(node_a) >= epsilon:
         #print('DFF', node, type(node), node_a, list(g.hops_from_node(node)))
         for hop in g.hops_from_node(node):
             if abs(hop.weight) >= epsilon:
                 yield Delta(hop.to_node, hop.weight * node_a, node)
Example #2
0
    def sentas_to_deltas(self, sentas: Iterable[SentA]) \
    -> Iterable[Delta]:
        # Find max incoming activation and sum of incoming activations for
        # each node.
        maxin_d: Dict[Node, float] = defaultdict(float)  # positive influences
        possumin_d: Dict[Node, float] = defaultdict(float)
        minin_d: Dict[Node, float] = defaultdict(float)  # negative influences
        negsumin_d: Dict[Node, float] = defaultdict(float)

        for senta in sentas:
            if senta.a >= 0:
                maxin_d[senta.to_node] = max(maxin_d[senta.to_node], senta.a)
                possumin_d[senta.to_node] += senta.a
            elif senta.a < 0:
                minin_d[senta.to_node] = min(minin_d[senta.to_node], senta.a)
                negsumin_d[senta.to_node] += senta.a

        # Make Deltas from the Tyrrell averages of the SentA's
        multiplier = 1.0 - self.alpha
        for node in union(maxin_d.keys(), minin_d.keys()):
            amt = multiplier * (
                ((maxin_d.get(node, 0.0) +
                  self.tyrrell_alpha * possumin_d.get(node, 0.0)) /
                 (1 + self.tyrrell_alpha)) +
                ((minin_d.get(node, 0.0) +
                  self.tyrrell_beta * negsumin_d.get(node, 0.0)) /
                 (1 + self.tyrrell_beta)))
            if abs(amt) >= epsilon:
                yield Delta(node, amt)
Example #3
0
 def INFLATIONARY_deltas_from(self, g, old_d, nodeid) \
 -> List[Delta]:
     '''Deltas from nodeid to its neighbors.'''
     result: List[Delta] = []
     nodeid_a = old_d.get(nodeid, 0.0)
     for neighborid, edge_d in g.adj[nodeid].items():
         weight = edge_d.get('weight', 1.0)
         delta = Delta(neighborid, weight * nodeid_a, nodeid)
         result.append(delta)
     return result
Example #4
0
 def deltas_to(self, g, old_d: Dict[NodeId, float], nodeid: NodeId) \
 -> List[Delta]:
     incoming_deltas = []
     for neighborid in g.incoming_activation_neighbors(nodeid):
         support_for_neighbor = old_d.get(neighborid, 0.0)
         incoming_deltas.append(
             Delta(
                 nodeid,
                 self.hop_weight(g, neighborid, nodeid) *
                 support_for_neighbor, neighborid))
     return incoming_deltas
Example #5
0
 def rescale_deltas(self, deltas, node_a) -> List[Delta]:
     if not deltas:
         return deltas
     ssum = sum(delta.amt for delta in deltas)
     if ssum <= node_a:
         return deltas
     else:
         multiplier = node_a / ssum
         return [
             Delta(d.nodeid, d.amt * multiplier, d.neighborid)
                 for d in deltas
         ]
Example #6
0
 def rescale_deltas(
     self, outgoing_deltas: List[Delta], support_for_node: float
 ) -> List[Delta]:
     if not outgoing_deltas:
         return outgoing_deltas
     ssum = sum(delta.amt for delta in outgoing_deltas)
     if ssum <= support_for_node:
         return outgoing_deltas
     else:
         multiplier = support_for_node / ssum
         return [
             Delta(d.nodeid, d.amt * multiplier, d.neighborid)
                 for d in outgoing_deltas
         ]
Example #7
0
 def deltas_from(self, g, old_d, node) -> Iterable[Delta]:
     '''Deltas specify changes to node's neighbors, not to node.'''
     node_a = old_d.get(node, 0.0)  # node's current activation
     outgoing_deltas = []
     for neighbor, edge_d in g.adj[node].items():
         weight = edge_d.get('weight', 1.0)
         neighbor_a = old_d.get(node, 0.0)  # neighbor's current activation
         outgoing_deltas.append(
             Delta(
                 neighbor,
                 weight, # + self.positive_feedback_rate * neighbor_a,
                 node
             )
         )
     return self.rescale_deltas(outgoing_deltas, node_a)
Example #8
0
 def deltas_from(self, g, old_d: Dict[NodeId, float], nodeid: NodeId) \
 -> Iterable[Delta]:
     support_for_node = old_d.get(nodeid, 0.0)
     outgoing_deltas = []
     for hop in g.support_hops_from(nodeid):
         neighborid = hop.to_node
         support_for_neighbor = old_d.get(neighborid, 0.0)
         hop_weight = g._hop_weight(hop)
         outgoing_deltas.append(Delta(
             neighborid,
             hop_weight + 
                 self.positive_feedback_rate * support_for_neighbor,
             nodeid
         ))
     result = self.rescale_deltas(outgoing_deltas, support_for_node)
     #print('DFROM', nodeid, result)
     return result
Example #9
0
    def deltas_from(self, g, old_d, nodeid) \
    -> List[Delta]:
        '''Deltas from nodeid to its neighbors.

        Outgoing weights are quasi-averaged in a way similar to that used by
        Toby Tyrell, but the quasi-averaging is done on the outgoing edges
        rather than the incoming edges. This might not work as well.'''
        result: List[Delta] = []
        nodeid_a = old_d.get(nodeid, 0.0)
        nws: List[NeighborW] = g.incident_nws(nodeid)
        num_edges = len(nws)
        #        wtotal = sum(nws, key=attrgetter('weight'))
        #        wmax = max(nws, key=attrgetter('weight'))
        #        alpha = 1.0 / num_edges**2
        multiplier = self.inflation_constant / (num_edges +
                                                self.inflation_constant - 1)
        for nw in nws:
            delta = Delta(nw.neighbor, nodeid_a * nw.weight * multiplier,
                          nodeid)
            result.append(delta)
        return result
Example #10
0
 def deltas_to(self, g, old_d, node):
     for hop in g.hops_to_node(node):
         if abs(hop.weight) >= epsilon:
             neighbor_a = old_d.get(hop.from_node, 0.0)
             if abs(neighbor_a) >= epsilon:
                 yield Delta(node, hop.weight * neighbor_a, hop.from_node)