import sys
import os.path as osp
this_dir = osp.dirname(__file__)
lib_path = osp.join(this_dir, '..')
sys.path.insert(0, lib_path)
import torch
from AutoRec.trainer import Trainer
from AutoRec.network import AutoRec
from AutoRec.dataloader import dataProcess

autorec_config = \
{
    'train_ratio': 0.9,
    'num_epoch': 100,
    'batch_size': 100,
    'optimizer': 'adam',
    'adam_lr': 1e-3,
    'l2_regularization':1e-4,
    'num_users': 6040,
    'num_items': 3952,
    'hidden_units': 500,
    'lambda': 1,
    'device_id': 0,
    'use_cuda': True,
    'data_file': '../Data/ml-1m/ratings.dat',
    'model_name': '../TrainedModels/AutoRec.model'
}

if __name__ == "__main__":
    ####################################################################################
    # AutoRec 自编码器协同过滤算法
    ####################################################################################
    train_r, train_mask_r, test_r, test_mask_r, \
    user_train_set, item_train_set, user_test_set, item_test_set = \
        dataProcess(autorec_config['data_file'], autorec_config['num_users'], autorec_config['num_items'], autorec_config['train_ratio'])
    # 实例化AutoRec对象
    autorec = AutoRec(config=autorec_config)

    ####################################################################################
    # 模型训练阶段
    ###################################################################################
    # 实例化模型训练器
    trainer = Trainer(model=autorec, config=autorec_config)
    # 开始训练
    trainer.train(train_r, train_mask_r)
    # 保存模型
    trainer.save()

    ###################################################################################
    # 模型测试阶段
    ###################################################################################
    # 实例化AutoRec对象
    autorec = AutoRec(config=autorec_config)
    autorec.loadModel(map_location=torch.device('cpu'))

    # 进行性能评估
    autorec.evaluate(test_r, test_mask_r, user_test_set=user_test_set, user_train_set=user_train_set, \
                     item_test_set=item_test_set, item_train_set=item_train_set)

    # 从测试集中抽取1个用户，推荐5个商品
    print(autorec.recommend_user(test_r[0], 5))



