import time
from dgl.sampling import node2vec_random_walk
from model import Node2vecModel
from utils import load_graph, parse_arguments


def time_randomwalk(graph, args):
    """
    Test cost time of random walk
    """

    start_time = time.time()

    # default setting for testing
    params = {'p': 0.25,
              'q': 4,
              'walk_length': 50}

    for i in range(args.runs):
        node2vec_random_walk(graph, graph.nodes(), **params)
    end_time = time.time()
    cost_time_avg = (end_time-start_time)/args.runs
    print("Run dataset {} {} trials, mean run time: {:.3f}s".format(args.dataset, args.runs, cost_time_avg))


def train_node2vec(graph, eval_set, args):
    """
    Train node2vec model
    """
    trainer = Node2vecModel(graph,
                            embedding_dim=args.embedding_dim,
                            walk_length=args.walk_length,
                            p=args.p,
                            q=args.q,
                            num_walks=args.num_walks,
                            eval_set=eval_set,
                            eval_steps=1,
                            device=args.device)

    trainer.train(epochs=args.epochs, batch_size=args.batch_size, learning_rate=0.01)


if __name__ == '__main__':

    args = parse_arguments()
    graph, eval_set = load_graph(args.dataset)

    if args.task == 'train':
        print("Perform training node2vec model")
        train_node2vec(graph, eval_set, args)
    elif args.task == 'time':
        print("Timing random walks")
        time_randomwalk(graph, args)
    else:
        raise ValueError('Task type error!')
