def get_recommenders_set():

    # nc = ContextNeighbourhoodCalculator()
    # ncc = NeighbourContributionCalculator()
    # ubc = UserBaselineCalculator()
    # usc = PBCSimilarityCalculator()
    # cosine_usc = CBCSimilarityCalculator()

    # Similarity calculators
    cosine_sc = CosineSimilarityCalculator()
    pearson_sc = PearsonSimilarityCalculator()
    pbc_sc = PBCSimilarityCalculator()
    cbu_sc = CBCSimilarityCalculator()
    similarity_calculators = [cosine_sc, pearson_sc, pbc_sc, cbu_sc]

    # Neighbourhood calculators
    simple_nc = SimpleNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    context_nc = ContextNeighbourhoodCalculator()
    # hybrid_nc0 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    # hybrid_nc0.weight = 0.0
    hybrid_nc02 = ContextHybridNeighbourhoodCalculator(
        copy.deepcopy(pearson_sc))
    hybrid_nc02.weight = 0.2
    hybrid_nc05 = ContextHybridNeighbourhoodCalculator(
        copy.deepcopy(pearson_sc))
    hybrid_nc05.weight = 0.5
    hybrid_nc08 = ContextHybridNeighbourhoodCalculator(
        copy.deepcopy(pearson_sc))
    hybrid_nc08.weight = 0.8
    # hybrid_nc1 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    # hybrid_nc1.weight = 1.0
    neighbourhood_calculators = [
        simple_nc,
        context_nc,
        # hybrid_nc0,
        # hybrid_nc02,
        hybrid_nc05,
        # hybrid_nc08,
        # hybrid_nc1
    ]

    # Baseline calculators
    simple_ubc = SimpleUserBaselineCalculator()
    ubc = UserBaselineCalculator()
    baseline_calculators = [ubc, simple_ubc]

    # Neighbour contribution calculators
    ncc = NeighbourContributionCalculator()
    context_ncc = ContextNCCalculator()
    neighbour_contribution_calculators = [
        ncc,
        # context_ncc
    ]

    num_topics = 150
    # num_neighbours = None

    numpy.random.seed(0)
    basic_cosine_knn = ContextualKNN(num_topics,
                                     simple_nc,
                                     ncc,
                                     simple_ubc,
                                     cosine_sc,
                                     has_context=False)
    basic_pearson_knn = ContextualKNN(num_topics,
                                      simple_nc,
                                      ncc,
                                      simple_ubc,
                                      pearson_sc,
                                      has_context=False)
    contextual_knn = ContextualKNN(num_topics,
                                   context_nc,
                                   ncc,
                                   ubc,
                                   pbc_sc,
                                   has_context=True)
    # get_knn_recommender_info(contextual_knn1)

    # ocelma_recommender = OcelmaRecommender()

    recommenders = [
        # basic_cosine_knn,
        # basic_pearson_knn,
        contextual_knn
        # ocelma_recommender
    ]

    num_neighbours_list = [None]
    # num_neighbours_list = [None, 3, 6, 10, 15, 20]
    threshold_list = [0.0, 0.5, 0.9]
    # threshold_list = [0.0]
    # num_topics_list = [10, 50, 150, 300, 500]
    num_topics_list = [150]

    # combined_recommenders = []
    # for recommender, num_neighbours in itertools.product(recommenders, num_neighbours_list):
    #     new_recommender = copy.deepcopy(recommender)
    #     new_recommender.num_neighbours = num_neighbours
    #     combined_recommenders.append(new_recommender)

    # threshold_list = [None]
    #
    # combined_recommenders = []
    # for recommender, threshold in itertools.product(recommenders, threshold_list):
    #     new_recommender = copy.deepcopy(recommender)
    #     new_recommender.threshold1 = threshold
    #     new_recommender.threshold2 = threshold
    #     new_recommender.threshold3 = threshold
    #     new_recommender.threshold4 = threshold
    #     combined_recommenders.append(new_recommender)

    # num_threshold_list = [0.2, 0.5, 0.7]

    combined_recommenders = combine_recommenders(
        neighbourhood_calculators, neighbour_contribution_calculators,
        baseline_calculators, similarity_calculators, num_neighbours_list,
        threshold_list, num_topics_list)

    baseline_recommender = ContextualKNN(num_topics,
                                         simple_nc,
                                         ncc,
                                         simple_ubc,
                                         pearson_sc,
                                         has_context=True)
    best_recommender = ContextualKNN(num_topics,
                                     hybrid_nc05,
                                     ncc,
                                     simple_ubc,
                                     pbc_sc,
                                     has_context=True)
    # best_recommender = ContextualKNN(num_topics, simple_nc, ncc, ubc, cosine_sc, has_context=True)
    best_recommender.threshold1 = 0.9
    best_recommender.threshold2 = 0.9
    best_recommender.threshold3 = 0.9
    best_recommender.threshold4 = 0.9

    my_recommenders = [
        # baseline_recommender,
        best_recommender
    ]

    return my_recommenders
def get_recommenders_set():

     # nc = ContextNeighbourhoodCalculator()
    # ncc = NeighbourContributionCalculator()
    # ubc = UserBaselineCalculator()
    # usc = PBCSimilarityCalculator()
    # cosine_usc = CBCSimilarityCalculator()

    # Similarity calculators
    cosine_sc = CosineSimilarityCalculator()
    pearson_sc = PearsonSimilarityCalculator()
    pbc_sc = PBCSimilarityCalculator()
    cbu_sc = CBCSimilarityCalculator()
    similarity_calculators = [
        cosine_sc,
        pearson_sc,
        pbc_sc,
        cbu_sc
    ]

    # Neighbourhood calculators
    simple_nc = SimpleNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    context_nc = ContextNeighbourhoodCalculator()
    # hybrid_nc0 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    # hybrid_nc0.weight = 0.0
    hybrid_nc02 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    hybrid_nc02.weight = 0.2
    hybrid_nc05 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    hybrid_nc05.weight = 0.5
    hybrid_nc08 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    hybrid_nc08.weight = 0.8
    # hybrid_nc1 = ContextHybridNeighbourhoodCalculator(copy.deepcopy(pearson_sc))
    # hybrid_nc1.weight = 1.0
    neighbourhood_calculators = [
        simple_nc,
        context_nc,
        # hybrid_nc0,
        # hybrid_nc02,
        hybrid_nc05,
        # hybrid_nc08,
        # hybrid_nc1
    ]

    # Baseline calculators
    simple_ubc = SimpleUserBaselineCalculator()
    ubc = UserBaselineCalculator()
    baseline_calculators = [
        ubc,
        simple_ubc
    ]

    # Neighbour contribution calculators
    ncc = NeighbourContributionCalculator()
    context_ncc = ContextNCCalculator()
    neighbour_contribution_calculators = [
        ncc,
        # context_ncc
    ]

    num_topics = 150
    # num_neighbours = None

    numpy.random.seed(0)
    basic_cosine_knn = ContextualKNN(num_topics, simple_nc, ncc, simple_ubc, cosine_sc, has_context=False)
    basic_pearson_knn = ContextualKNN(num_topics, simple_nc, ncc, simple_ubc, pearson_sc, has_context=False)
    contextual_knn = ContextualKNN(num_topics, context_nc, ncc, ubc, pbc_sc, has_context=True)
    # get_knn_recommender_info(contextual_knn1)

    # ocelma_recommender = OcelmaRecommender()

    recommenders = [
        # basic_cosine_knn,
        # basic_pearson_knn,
        contextual_knn
        # ocelma_recommender
    ]

    num_neighbours_list = [None]
    # num_neighbours_list = [None, 3, 6, 10, 15, 20]
    threshold_list = [0.0, 0.5, 0.9]
    # threshold_list = [0.0]
    # num_topics_list = [10, 50, 150, 300, 500]
    num_topics_list = [150]

    # combined_recommenders = []
    # for recommender, num_neighbours in itertools.product(recommenders, num_neighbours_list):
    #     new_recommender = copy.deepcopy(recommender)
    #     new_recommender.num_neighbours = num_neighbours
    #     combined_recommenders.append(new_recommender)

    # threshold_list = [None]
    #
    # combined_recommenders = []
    # for recommender, threshold in itertools.product(recommenders, threshold_list):
    #     new_recommender = copy.deepcopy(recommender)
    #     new_recommender.threshold1 = threshold
    #     new_recommender.threshold2 = threshold
    #     new_recommender.threshold3 = threshold
    #     new_recommender.threshold4 = threshold
    #     combined_recommenders.append(new_recommender)


    # num_threshold_list = [0.2, 0.5, 0.7]

    combined_recommenders = combine_recommenders(
        neighbourhood_calculators,
        neighbour_contribution_calculators,
        baseline_calculators,
        similarity_calculators,
        num_neighbours_list,
        threshold_list,
        num_topics_list
    )

    baseline_recommender = ContextualKNN(num_topics, simple_nc, ncc, simple_ubc, pearson_sc, has_context=True)
    best_recommender = ContextualKNN(num_topics, hybrid_nc05, ncc, simple_ubc, pbc_sc, has_context=True)
    # best_recommender = ContextualKNN(num_topics, simple_nc, ncc, ubc, cosine_sc, has_context=True)
    best_recommender.threshold1 = 0.9
    best_recommender.threshold2 = 0.9
    best_recommender.threshold3 = 0.9
    best_recommender.threshold4 = 0.9

    my_recommenders = [
        # baseline_recommender,
        best_recommender
    ]

    return my_recommenders
def combine_recommenders(neighbourhood_calculators,
                         neighbour_contribution_calculators,
                         baseline_calculators, similarity_calculators,
                         num_neighbours_list, thresholds, num_topics_list):

    combined_recommenders = []

    for neighbourhood_calculator,\
        neighbour_contribution_calculator,\
        baseline_calculator,\
        similarity_calculator,\
        num_neighbours,\
        threshold,\
        num_topics\
        in itertools.product(
            neighbourhood_calculators,
            neighbour_contribution_calculators,
            baseline_calculators,
            similarity_calculators,
            num_neighbours_list,
            thresholds,
            num_topics_list):
        recommender = ContextualKNN(None,
                                    None,
                                    None,
                                    None,
                                    None,
                                    has_context=True)
        recommender.neighbourhood_calculator = neighbourhood_calculator
        recommender.neighbour_contribution_calculator =\
            neighbour_contribution_calculator
        recommender.user_baseline_calculator = baseline_calculator
        recommender.user_similarity_calculator = similarity_calculator
        recommender.num_neighbours = num_neighbours
        recommender.threshold1 = threshold
        recommender.threshold2 = threshold
        recommender.threshold3 = threshold
        recommender.threshold4 = threshold
        recommender.num_topics = num_topics
        combined_recommenders.append(recommender)

    return combined_recommenders
def combine_recommenders(
        neighbourhood_calculators,
        neighbour_contribution_calculators,
        baseline_calculators,
        similarity_calculators,
        num_neighbours_list,
        thresholds,
        num_topics_list):

    combined_recommenders = []

    for neighbourhood_calculator,\
        neighbour_contribution_calculator,\
        baseline_calculator,\
        similarity_calculator,\
        num_neighbours,\
        threshold,\
        num_topics\
        in itertools.product(
            neighbourhood_calculators,
            neighbour_contribution_calculators,
            baseline_calculators,
            similarity_calculators,
            num_neighbours_list,
            thresholds,
            num_topics_list):
        recommender = ContextualKNN(
            None, None, None, None, None, has_context=True)
        recommender.neighbourhood_calculator = neighbourhood_calculator
        recommender.neighbour_contribution_calculator =\
            neighbour_contribution_calculator
        recommender.user_baseline_calculator = baseline_calculator
        recommender.user_similarity_calculator = similarity_calculator
        recommender.num_neighbours = num_neighbours
        recommender.threshold1 = threshold
        recommender.threshold2 = threshold
        recommender.threshold3 = threshold
        recommender.threshold4 = threshold
        recommender.num_topics = num_topics
        combined_recommenders.append(recommender)

    return combined_recommenders