docs: def generate_monitors(self):
          """
          Generate monitors for each actor in the system
          :return:
          """
          submons = []
          for a in self.actors:
              # Get all remote formula
              remotes = a.formula.walk(filter_type=At)
              # Compute formula hash
              for f in remotes:
                  f.compute_hash(sid=a.name)
  
              # Create the global monitor for the actor
              a.monitor = Dtlmon(a.formula, a.trace)
  
              # Create the remote sub monitors for each @Formula
              for f in remotes:
                  remote_actor = self.get_actor(f.agent)
                  remote_actor.submons.append(Dtlmon(formula=f.inner, trace=remote_actor.trace, parent=remote_actor.monitor, fid=f.fid))
                  submons.append({"fid": f.fid, "actor": remote_actor.name})
  
              # Create the com entry in the system
              for a2 in self.actors:
                  self.coms["%s->%s" % (a.name, a2.name)] = []
                  self.coms["%s->%s" % (a2.name, a.name)] = []
  
          # Create the general KV structure
          kv = self.kv_implementation()
          for m in submons:
              kv.add_entry(self.kv_implementation.Entry(m["fid"], agent=m["actor"], value=Boolean3.Unknown, timestamp=0))
  
          # Add a copy of KV structure for each actor
          for a in self.actors:
              a.monitor.KV = copy.deepcopy(kv)