class 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();
    }

    public  Node2Vec(Graph graph, Node2VecBaseConfig config, ProgressLogger progressLogger, AllocationTracker tracker);

}