@Override public Set<Edge<V>> edgesOf(V vertex) { return m_graph.edgesOf(vertex); }
private void build(Task task, ImmutableList.Builder<RunnableTaskDag> entriesBuilder, ImmutableMap.Builder<TaskId, Task> tasksBuilder) { DefaultDirectedGraph<TaskId, DefaultEdge> graph = new DefaultDirectedGraph<>(DefaultEdge.class); worker(graph, task, null, tasksBuilder, Sets.newHashSet()); CycleDetector<TaskId, DefaultEdge> cycleDetector = new CycleDetector<>(graph); if ( cycleDetector.detectCycles() ) { throw new RuntimeException("The Task DAG contains cycles: " + task); } TopologicalOrderIterator<TaskId, DefaultEdge> orderIterator = new TopologicalOrderIterator<>(graph); while ( orderIterator.hasNext() ) { TaskId taskId = orderIterator.next(); Set<DefaultEdge> taskIdEdges = graph.edgesOf(taskId); Set<TaskId> processed = taskIdEdges .stream() .map(graph::getEdgeSource) .filter(edge -> !edge.equals(taskId) && !edge.getId().equals("")) .collect(Collectors.toSet()); entriesBuilder.add(new RunnableTaskDag(taskId, processed)); } }
@SuppressWarnings("unchecked") public InvalidationResult<STATE> invalidate(STATE state, RelationshipType relationshipType) { InvalidationResult<STATE> result = new InvalidationResult<STATE>(); // cascade changes to children (causal dependencies) of this task for (Edge edge : graph.edgesOf(state)) { if (edge.source().equals(state)) { // this vertex is coming FROM the invalid task, so cascade the invalidation. result.addAll(invalidate((STATE) edge.target(), ((RelationshipEdge) edge).getType())); } } // find the state's location AGENT agent = stateAgentReverseIndex.get(state); ITemporalSeries<STATE> temporalSeries = agentsTemporalSeries.get(agent); ITimePeriod timePeriod = stateTimePeriodIndex.get(state); if (relationshipType == RelationshipType.causal) { // for a causal relationship, the parent is invalid so this agent-state must be removed. // remove the state from all local data structures temporalSeries.remove(timePeriod.getEnd()); // use getEnd() because of exclusive-inclusive // semantics graph.removeVertex(state); stateAgentReverseIndex.remove(state); stateTimePeriodIndex.remove(state); } else { // for an influential relationship, some dependent data changed, so this agent-state must be // re-computed. // add it to the result collection to let the client decide how to proceed. result.add(RelationshipType.influential, state); } return result; }
InvalidationResult<STATE> result = new InvalidationResult<STATE>(); for (Edge edge : graph.edgesOf(state)) { if (edge.source().equals(state)) { STATE affectedAgentState = (STATE) edge.target();