docs: def communicates(self,fromstate, tostate, maxlength=999999):
          """See if a node communicates (directly or indirectly) with another. Returns the probability of the *shortest* path (probably, but not necessarily the highest probability)"""
          if (not (fromstate in self.nodes)) or (not (tostate in self.nodes)):
              return 0
          assert (fromstate != tostate)
  
  
          def _test(node,length,prob):
              if length > maxlength:
                  return 0
              if node == tostate:
                  prob *= self.edges_out[node][tostate]
                  return True
  
              for child in self.edges_out[node].keys():
                  if not child in visited:
                      visited.add(child)
                      if child == tostate:
                          return prob * self.edges_out[node][tostate]
                      else:
                          r = _test(child, length+1, prob * self.edges_out[node][tostate])
                          if r:
                              return r
              return 0
  
          visited = set(fromstate)
          return _test(fromstate,1,1)