### Question:
Node2Vec extends Algorithm<Node2Vec, HugeObjectArray<Vector>> { @Override public HugeObjectArray<Vector> compute() { RandomWalk randomWalk = new RandomWalk( graph, config.walkLength(), new RandomWalk.NextNodeStrategy(graph, config.returnFactor(), config.inOutFactor()), config.concurrency(), config.walksPerNode(), config.walkBufferSize() ); HugeObjectArray<long[]> walks = HugeObjectArray.newArray( long[].class, graph.nodeCount() * config.walksPerNode(), tracker ); MutableLong counter = new MutableLong(0); randomWalk .compute() .forEach(walk -> { walks.set(counter.longValue(), walk); counter.increment(); }); var probabilityComputer = new ProbabilityComputer( walks, graph.nodeCount(), config.centerSamplingFactor(), config.contextSamplingExponent(), config.concurrency(), tracker ); var node2VecModel = new Node2VecModel( graph.nodeCount(), config, walks, probabilityComputer, progressLogger, tracker ); node2VecModel.train(); return node2VecModel.getEmbeddings(); } Node2Vec(Graph graph, Node2VecBaseConfig config, ProgressLogger progressLogger, AllocationTracker tracker); @Override HugeObjectArray<Vector> compute(); @Override Node2Vec me(); @Override void release();  }### Answer:
@Test void shouldLogProgress() { Graph graph = new StoreLoaderBuilder() .api(db) .build() .graph(); int embeddingSize = 128; Node2VecStreamConfig config = ImmutableNode2VecStreamConfig.builder().embeddingSize(embeddingSize).build(); var testLogger = new TestProgressLogger( graph.nodeCount() * config.walksPerNode(), "Node2Vec", 4 ); new Node2Vec( graph, config, testLogger, AllocationTracker.empty() ).compute(); List<AtomicLong> progresses = testLogger.getProgresses(); assertEquals(config.iterations() + 1, progresses.size()); progresses.forEach(progress -> assertTrue(progress.get() <= graph.nodeCount() * config.walksPerNode())); assertTrue(testLogger.containsMessage(TestLog.INFO, ":: Start")); assertTrue(testLogger.containsMessage(TestLog.INFO, ":: Finished")); }