import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import (Dataset, DataLoader, RandomSampler, SequentialSampler, TensorDataset)
from torch.utils.data.distributed import DistributedSampler
from tqdm import tqdm, trange
import _pickle as cPickle

import sys
from transformers import (WEIGHTS_NAME, BertConfig, BertTokenizer)
from transformers import AdamW
from transformers import get_linear_schedule_with_warmup as WarmupLinearSchedule

# from vlnbert.modeling_bert import LanguageBert
from vlnbert.modeling_visbert import VLNBert

model_name_or_path = 'r2r_src/vlnbert/Prevalent/pretrained_model/pytorch_model.bin'

def get_tokenizer():
    tokenizer_class = BertTokenizer
    tokenizer = tokenizer_class.from_pretrained('bert-base-uncased')
    return tokenizer

def get_vlnbert_models(config=None):
    config_class = BertConfig
    model_class = VLNBert
    vis_config = config_class.from_pretrained('bert-base-uncased')

    # all configurations (need to pack into args)
    vis_config.img_feature_dim = 2176
    vis_config.img_feature_type = ""
    vis_config.update_lang_bert = False
    vis_config.update_add_layer = False
    vis_config.vl_layers = 4
    vis_config.la_layers = 9
    visual_model = VLNBert(vis_config)

    visual_model = model_class.from_pretrained(model_name_or_path, config=vis_config)

    return visual_model
