@Override public TestProgram clone() { try { final TestProgram clone = (TestProgram) super.clone(); clone.traversal = this.traversal.clone(); clone.programStep = new TraversalMatrix<>(clone.traversal.get()).getStepById(this.programStep.getId()); return clone; } catch (final CloneNotSupportedException e) { throw new IllegalStateException(e.getMessage(), e); } }
public TraversalMatrix(final Traversal.Admin<S, E> traversal) { this.harvestSteps(this.traversal = traversal); }
private static boolean isRemoteTraverser(final Traverser.Admin traverser, final TraversalMatrix<?, ?> traversalMatrix) { return traverser.get() instanceof Attachable && !(traverser.get() instanceof Path) && !isLocalElement(traversalMatrix.getStepById(traverser.getStepId())); }
final TraverserSet<Object> haltedTraversers, final HaltedTraverserStrategy haltedTraverserStrategy) { final TraversalSideEffects traversalSideEffects = traversalMatrix.getTraversal().getSideEffects(); final AtomicBoolean voteToHalt = new AtomicBoolean(true); final TraverserSet<Object> activeTraversers = new TraverserSet<>(); final Traverser.Admin<Object> traverser = traversers.next(); traversers.remove(); final Step<Object, Object> currentStep = traversalMatrix.getStepById(traverser.getStepId());
@Override public TraversalVertexProgram clone() { try { final TraversalVertexProgram clone = (TraversalVertexProgram) super.clone(); clone.traversal = this.traversal.clone(); if (!clone.traversal.get().isLocked()) clone.traversal.get().applyStrategies(); clone.traversalMatrix = new TraversalMatrix<>(clone.traversal.get()); clone.memoryComputeKeys = new HashSet<>(); for (final MemoryComputeKey memoryComputeKey : this.memoryComputeKeys) { clone.memoryComputeKeys.add(memoryComputeKey.clone()); } return clone; } catch (final CloneNotSupportedException e) { throw new IllegalStateException(e.getMessage(), e); } }
protected static void processMemory(final TraversalMatrix<?, ?> traversalMatrix, final Memory memory, final TraverserSet<Object> toProcessTraversers, final Set<String> completedBarriers) { // handle traversers and data that were sent from the workers to the master traversal via memory if (memory.exists(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { for (final String key : memory.<Set<String>>get(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { final Step<Object, Object> step = traversalMatrix.getStepById(key); assert step instanceof Barrier; completedBarriers.add(step.getId()); if (!(step instanceof LocalBarrier)) { // local barriers don't do any processing on the master traversal (they just lock on the workers) final Barrier<Object> barrier = (Barrier<Object>) step; barrier.addBarrier(memory.get(key)); step.forEachRemaining(toProcessTraversers::add); // if it was a reducing barrier step, reset the barrier to its seed value if (step instanceof ReducingBarrierStep) memory.set(step.getId(), ((ReducingBarrierStep) step).getSeedSupplier().get()); } } } memory.set(TraversalVertexProgram.MUTATED_MEMORY_KEYS, new HashSet<>()); }
final TraverserSet<Object> haltedTraversers, final HaltedTraverserStrategy haltedTraverserStrategy) { final TraversalSideEffects traversalSideEffects = traversalMatrix.getTraversal().getSideEffects(); final AtomicBoolean voteToHalt = new AtomicBoolean(true); final TraverserSet<Object> activeTraversers = new TraverserSet<>(); final Traverser.Admin<Object> traverser = traversers.next(); traversers.remove(); final Step<Object, Object> currentStep = traversalMatrix.getStepById(traverser.getStepId());
this.traversal.get().applyStrategies(); this.traversalMatrix = new TraversalMatrix<>(this.traversal.get());
@Override public void loadState(final Graph graph, final Configuration configuration) { VertexProgram.super.loadState(graph, configuration); this.traversal = PureTraversal.loadState(configuration, VertexProgramStep.ROOT_TRAVERSAL, graph); this.haltedTraversers = TraversalVertexProgram.loadHaltedTraversers(configuration); this.programStep = new TraversalMatrix<>(this.traversal.get()).getStepById(configuration.getString(ProgramVertexProgramStep.STEP_ID)); this.memoryComputeKeys.addAll(MemoryTraversalSideEffects.getMemoryComputeKeys(this.traversal.get())); this.memoryComputeKeys.add(MemoryComputeKey.of(TraversalVertexProgram.HALTED_TRAVERSERS, Operator.addAll, false, false)); this.memoryComputeKeys.add(MemoryComputeKey.of(TraversalVertexProgram.ACTIVE_TRAVERSERS, Operator.addAll, true, true)); }
remoteActiveTraversers.add(traverser.detach()); else { currentStep = traversalMatrix.getStepById(traverser.getStepId()); if (!currentStep.getId().equals(previousStep.getId()) && !(previousStep instanceof EmptyStep)) { GraphComputing.atMaster(previousStep, true);
@Override public TraversalVertexProgram clone() { try { final TraversalVertexProgram clone = (TraversalVertexProgram) super.clone(); clone.traversal = this.traversal.clone(); if (!clone.traversal.get().isLocked()) clone.traversal.get().applyStrategies(); clone.traversalMatrix = new TraversalMatrix<>(clone.traversal.get()); clone.memoryComputeKeys = new HashSet<>(); for (final MemoryComputeKey memoryComputeKey : this.memoryComputeKeys) { clone.memoryComputeKeys.add(memoryComputeKey.clone()); } return clone; } catch (final CloneNotSupportedException e) { throw new IllegalStateException(e.getMessage(), e); } }
private final void harvestSteps(final Traversal.Admin<?, ?> traversal) { for (final Step<?, ?> step : traversal.getSteps()) { this.matrix.put(step.getId(), step); if (step instanceof TraversalParent) { for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) { this.harvestSteps(globalChild); } for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) { this.harvestSteps(localChild); } } } } }
@Override public TestProgram clone() { try { final TestProgram clone = (TestProgram) super.clone(); clone.traversal = this.traversal.clone(); clone.programStep = new TraversalMatrix<>(clone.traversal.get()).getStepById(this.programStep.getId()); return clone; } catch (final CloneNotSupportedException e) { throw new IllegalStateException(e.getMessage(), e); } }
final Step<?, ?> step = this.traversalMatrix.getStepById(stepId); if (step instanceof Barrier) ((Barrier) this.traversalMatrix.getStepById(stepId)).done();
this.traversal.get().applyStrategies(); this.traversalMatrix = new TraversalMatrix<>(this.traversal.get());
public TraversalMatrix(final Traversal.Admin<S, E> traversal) { this.harvestSteps(this.traversal = traversal); }
@Override public void loadState(final Graph graph, final Configuration configuration) { VertexProgram.super.loadState(graph, configuration); this.traversal = PureTraversal.loadState(configuration, VertexProgramStep.ROOT_TRAVERSAL, graph); this.haltedTraversers = TraversalVertexProgram.loadHaltedTraversers(configuration); this.programStep = new TraversalMatrix<>(this.traversal.get()).getStepById(configuration.getString(ProgramVertexProgramStep.STEP_ID)); this.memoryComputeKeys.addAll(MemoryTraversalSideEffects.getMemoryComputeKeys(this.traversal.get())); this.memoryComputeKeys.add(MemoryComputeKey.of(TraversalVertexProgram.HALTED_TRAVERSERS, Operator.addAll, false, false)); this.memoryComputeKeys.add(MemoryComputeKey.of(TraversalVertexProgram.ACTIVE_TRAVERSERS, Operator.addAll, true, true)); }
private static boolean isRemoteTraverser(final Traverser.Admin traverser, final TraversalMatrix<?, ?> traversalMatrix) { return traverser.get() instanceof Attachable && !(traverser.get() instanceof Path) && !isLocalElement(traversalMatrix.getStepById(traverser.getStepId())); }
private final void harvestSteps(final Traversal.Admin<?, ?> traversal) { for (final Step<?, ?> step : traversal.getSteps()) { this.matrix.put(step.getId(), step); if (step instanceof TraversalParent) { for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) { this.harvestSteps(globalChild); } for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) { this.harvestSteps(localChild); } } } } }
protected static void processMemory(final TraversalMatrix<?, ?> traversalMatrix, final Memory memory, final TraverserSet<Object> toProcessTraversers, final Set<String> completedBarriers) { // handle traversers and data that were sent from the workers to the master traversal via memory if (memory.exists(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { for (final String key : memory.<Set<String>>get(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { final Step<Object, Object> step = traversalMatrix.getStepById(key); assert step instanceof Barrier; completedBarriers.add(step.getId()); if (!(step instanceof LocalBarrier)) { // local barriers don't do any processing on the master traversal (they just lock on the workers) final Barrier<Object> barrier = (Barrier<Object>) step; barrier.addBarrier(memory.get(key)); step.forEachRemaining(toProcessTraversers::add); // if it was a reducing barrier step, reset the barrier to its seed value if (step instanceof ReducingBarrierStep) memory.set(step.getId(), ((ReducingBarrierStep) step).getSeedSupplier().get()); } } } memory.set(TraversalVertexProgram.MUTATED_MEMORY_KEYS, new HashSet<>()); }