def eval_and_save(variables_pack_for_eval_and_save, round_num, sess):
    loss_sum = 0.
    accuracy_sum = 0.
    nums = 0
    stored_arr = []
    model = variables_pack_for_eval_and_save['model']
    for src, tgt in variables_pack_for_eval_and_save['test_set']:
        nums += 1
        uids, mids, cats, mid_his, cat_his, mid_mask, target, sl = gn_fn.prepare_data(
            src, tgt)
        prob, loss, acc = model.calculate(
            sess, [uids, mids, cats, mid_his, cat_his, mid_mask, target, sl])
        loss_sum += loss
        accuracy_sum += acc
        prob_1 = prob[:, 0].tolist()
        target_1 = target[:, 0].tolist()
        for p, t in zip(prob_1, target_1):
            stored_arr.append([p, t])
    test_auc = calc_auc(stored_arr)
    accuracy_sum = accuracy_sum / nums
    loss_sum = loss_sum / nums
    if variables_pack_for_eval_and_save['best_auc'] < test_auc:
        variables_pack_for_eval_and_save['best_auc'] = test_auc
        variables_pack_for_eval_and_save['best_round'] = round_num
        variables_pack_for_eval_and_save['saver'].save(
            sess, variables_pack_for_eval_and_save['CHECKPOINT_DIR'])
    return test_auc, loss_sum, accuracy_sum
                                             placeholders)
    sess.run(update_local_vars_op, feed_dict=feed_dict)
    print('Weights succesfully initialized')
    sys.stdout.flush()

    # begin training process
    print('Begin training')
    sys.stdout.flush()
    temp_start_time = time.time()

    loss_sum = 0.0
    accuracy_sum = 0.0
    local_iter_cnt = 0
    for epoch in range(local_epoch_num):
        for src, tgt in succinct_train_set:
            uids, mids, cats, mid_his, cat_his, mid_mask, target, sl = gn_fn.prepare_data(
                src, tgt)
            loss, acc = model.train(sess, [
                uids, mids, cats, mid_his, cat_his, mid_mask, target, sl,
                hyperparameters['learning_rate']
            ])
            loss_sum += loss
            accuracy_sum += acc
            local_iter_cnt += 1

    print('%d round training over' % round_num)
    if local_iter_cnt > 0:
        print(
            'time: %d ----> iter: %d ----> train_loss: %.4f ---- train_accuracy: %.4f'
            % (time.time() - temp_start_time, local_iter_cnt,
               loss_sum / local_iter_cnt, accuracy_sum / local_iter_cnt))
    else: