featurepagerankcyberank
------------------------------------------------------------------------------------------------------------------------------------------------
input structuredirected graph with edges indicating linkscybergraph
damping factortypically set to 0.85consensus parameter
link representationedges with equal weightattention and will token
handling dangling nodesdistributed uniformly among all nodesadjusted rank calculation considering dangling nodes explicitly
rank initializationuniformly distributed initial ranksstarts with all ranks initialized to zero
normalizationensures rank sum equals oneimplicit normalization through rank adjustments and damping factor
  • pseudocode in python
    • import functools
      import operator
      import collections
      def cyberank(cyberlinks: list, tolerance: float = 0.001, damping_factor: float = 0.8):
          cyberlinks_dict = dict(functools.reduce(operator.add, map(collections.Counter, cyberlinks)))
          objects = list(set([item for t in [list(x.keys())[0] for x in cyberlinks] for item in t]))
          rank = [0] * len(objects)
          size = len(objects)
          default_rank = (1.0 - damping_factor) / size
          dangling_nodes = [obj for obj in objects if obj not in [list(cyberlink.keys())[0][1] for cyberlink in cyberlinks]]
          dangling_nodes_size = len(dangling_nodes)
          inner_product_over_size = default_rank * (dangling_nodes_size / size)
          default_rank_with_correction = (damping_factor * inner_product_over_size) + default_rank
          change = tolerance + 1
          steps = 0
          prevrank = [0] * len(objects)
      while change > tolerance:
          for obj in objects:
              obj_index = objects.index(obj)
              ksum = 0
              income_cyberlinks = [income_cyberlink for income_cyberlink in [list(x.keys())[0] for x in cyberlinks] if income_cyberlink[1] == obj]
              for cyberlink in income_cyberlinks:
                  linkStake = cyberlinks_dict[cyberlink]
                  outcome_cyberlinks = [outcome_cyberlink for outcome_cyberlink in [list(x.keys())[0] for x in cyberlinks] if outcome_cyberlink[0] == cyberlink[0]]
                  jCidOutStake = sum([cyberlinks_dict[outcome_cyberlink] for outcome_cyberlink in outcome_cyberlinks])
                  if linkStake == 0 or jCidOutStake == 0:
                      continue
                  weight = linkStake / jCidOutStake
                  ksum = prevrank[obj_index] * weight + ksum
              rank[obj_index] = ksum * damping_factor + default_rank_with_correction
          change = abs(max(rank) - max(prevrank))
          prevrank = rank
          steps += 1
      res = list(zip(objects, rank))
      res.sort(reverse=True, key=lambda x: x[1])
      return res
  • go-cyber implementation of cyberank in go
  • cyberank is being used as factor in
  • display cyberank in apps
    • 🦠 emoji icon virus
    • examples
      • full number: 176 711 938 🦠
      • game number: 176 🦠🦠🦠