Class CommunicationTracker

java.lang.Object
tools.refinery.interpreter.rete.network.communication.CommunicationTracker
Direct Known Subclasses:
TimelessCommunicationTracker, TimelyCommunicationTracker

public abstract class CommunicationTracker extends Object
An instance of this class is associated with every ReteContainer. The tracker serves two purposes:
(1) It allows RETE nodes to register their communication dependencies on-the-fly. These dependencies can be registered or unregistered when nodes are disposed of.
(2) It allows RETE nodes to register their mailboxes as dirty, that is, they can tell the tracker that they have something to send to other nodes in the network. The tracker is then responsible for ordering these messages (more precisely, the mailboxes that contain the messages) for the associated ReteContainer. The ordering is governed by the strongly connected components in the dependency network and follows a topological sorting scheme; those mailboxes will be emptied first whose owner nodes do not depend on other undelivered messages.
Since:
1.6
  • Field Details

    • minGroupId

      protected int minGroupId
      The minimum group id assigned so far
    • maxGroupId

      protected int maxGroupId
      The maximum group id assigned so far
    • dependencyGraph

      protected final Graph<Node> dependencyGraph
      The dependency graph of the communications in the RETE network
    • groupMap

      protected final Map<Node,CommunicationGroup> groupMap
      Precomputed node -> communication group map
    • groupQueue

      protected final Queue<CommunicationGroup> groupQueue
      Priority queue of active communication groups
  • Constructor Details

    • CommunicationTracker

      public CommunicationTracker(org.apache.log4j.Logger logger)
  • Method Details

    • getDependencyGraph

      public Graph<Node> getDependencyGraph()
    • getGroup

      public CommunicationGroup getGroup(Node node)
    • getPartition

      @Nullable protected @Nullable Set<Node> getPartition(Node node)
    • isSingleton

      protected boolean isSingleton(Node node)
    • getRepresentative

      protected Node getRepresentative(Node node)
    • hasOutgoingEdges

      protected boolean hasOutgoingEdges(Node representative)
    • getReducedGraph

      protected Graph<Node> getReducedGraph()
    • reconstructQueueContents

      protected abstract void reconstructQueueContents(Set<CommunicationGroup> oldActiveGroups)
      This method is responsible for reconstructing the active queue contents after the network structure has changed. It it defined as abstract because the reconstruction logic is specific to each CommunicationTracker.
      Since:
      2.4
    • activateUnenqueued

      public void activateUnenqueued(CommunicationGroup group)
    • deactivate

      public void deactivate(CommunicationGroup group)
    • getAndRemoveFirstGroup

      public CommunicationGroup getAndRemoveFirstGroup()
    • isEmpty

      public boolean isEmpty()
    • createGroup

      protected abstract CommunicationGroup createGroup(Node representative, int index)
    • createAndStoreGroup

      protected CommunicationGroup createAndStoreGroup(Node representative, int index)
    • registerDependency

      public void registerDependency(Node source, Node target)
      Registers the dependency that the target Node depends on the source Node. In other words, source may send messages to target in the RETE network. If the dependency edge is already present, this method call is a noop.
      Parameters:
      source - the source node
      target - the target node
    • isInRecursiveGroup

      public boolean isInRecursiveGroup(Node node)
      Returns true if the given Node is in a recursive CommunicationGroup, false otherwise.
    • areInSameGroup

      public boolean areInSameGroup(Node left, Node right)
      Returns true if the given two Nodes are in the same CommunicationGroup.
    • unregisterDependency

      public void unregisterDependency(Node source, Node target)
      Unregisters a dependency between source and target.
      Parameters:
      source - the source node
      target - the target node
    • isRecursionCutPoint

      protected boolean isRecursionCutPoint(Node source, Node target)
      Returns true if the given source-target edge in the communication network acts as a recursion cut point. The current implementation considers edges leading into ProductionNodes as cut point iff both source and target belong to the same group.
      Parameters:
      source - the source node
      target - the target node
      Returns:
      true if the edge is a cut point, false otherwise
      Since:
      2.4
    • postProcessNode

      protected abstract void postProcessNode(Node node)
      This hook allows concrete tracker implementations to perform tracker-specific post processing on nodes (cf. NetworkStructureChangeSensitiveNode and BehaviorChangingMailbox). At the time of the invocation, the network topology has already been updated.
    • postProcessGroup

      protected abstract void postProcessGroup(CommunicationGroup group)
      This hook allows concrete tracker implementations to perform tracker-specific post processing on groups. At the time of the invocation, the network topology has already been updated.
      Since:
      2.4
    • proxifyMailbox

      public abstract Mailbox proxifyMailbox(Node requester, Mailbox original)
      Creates a proxy for the given Mailbox for the given requester Node. The proxy creation is CommunicationTracker-specific and depends on the identity of the requester. This method is primarily used to create TimelyMailboxProxys depending on the network topology. There is no guarantee that the same proxy instance is returned when this method is called multiple times with the same arguments.
    • proxifyIndexerListener

      public abstract IndexerListener proxifyIndexerListener(Node requester, IndexerListener original)
      Creates a proxy for the given IndexerListener for the given requester Node. The proxy creation is CommunicationTracker-specific and depends on the identity of the requester. This method is primarily used to create TimelyIndexerListenerProxys depending on the network topology. There is no guarantee that the same proxy instance is returned when this method is called multiple times with the same arguments.