def test01():
    print("Test 01")

    # number of recommended items
    N: int = 5

    methodsResultDict: dict = {
        "method1": pd.Series([0.9, 0.5, 0.4, 0.2], [1, 2, 3, 4],
                             name="rating"),
        "method2": pd.Series([0.2, 0.9, 0.01], [3, 4, 5], name="rating"),
        "method3": pd.Series([0.01, 0.9, 0.9], [5, 6, 7], name="rating")
    }

    # methods parametes
    methodsParamsData: List[tuple] = [['method1', 5, 10, 1, 1],
                                      ['method2', 5, 12, 1, 1],
                                      ['method3', 6, 13, 1, 1]]
    modelDF: DataFrame = pd.DataFrame(
        methodsParamsData, columns=["methodID", "r", "n", "alpha0", "beta0"])
    modelDF.set_index("methodID", inplace=True)

    #modelDF:DataFrame = DataFrame({"votes": [0.5, 0.4, 0.1]}, index=["method1", "method2", "method3"])
    #print(modelDF)

    userID: int = 0

    aggr: AggrDHondtDirectOptimizeThompsonSampling = AggrDHondtDirectOptimizeThompsonSampling(
        HistoryDF(""), {
            AggrDHondtDirectOptimizeThompsonSampling.ARG_SELECTOR:
            TheMostVotedItemSelector({}),
            AggrDHondtDirectOptimizeThompsonSampling.ARG_DISCOUNT_FACTOR:
            "uniform"
        })
    itemIDs: List[tuple] = aggr.run(methodsResultDict, modelDF, userID, N)
    print("itemIDs:" + str(itemIDs))

    aggr: AggrDHondtDirectOptimizeThompsonSampling = AggrDHondtDirectOptimizeThompsonSampling(
        HistoryDF(""), {
            AggrDHondtDirectOptimizeThompsonSampling.ARG_SELECTOR:
            TheMostVotedItemSelector({}),
            AggrDHondtDirectOptimizeThompsonSampling.ARG_DISCOUNT_FACTOR:
            "DCG"
        })
    itemIDs: List[tuple] = aggr.run(methodsResultDict, modelDF, userID, N)
    print("itemIDs:" + str(itemIDs))

    aggr: AggrDHondtDirectOptimizeThompsonSampling = AggrDHondtDirectOptimizeThompsonSampling(
        HistoryDF(""), {
            AggrDHondtDirectOptimizeThompsonSampling.ARG_SELECTOR:
            TheMostVotedItemSelector({}),
            AggrDHondtDirectOptimizeThompsonSampling.ARG_DISCOUNT_FACTOR:
            "PowerLaw"
        })
    itemIDs: List[tuple] = aggr.run(methodsResultDict, modelDF, userID, N)
    print("itemIDs:" + str(itemIDs))
Exemple #2
0
def getContextFuzzyDHondtDirectOptimizeINF():
  # taskID:str = "Web" + "ContextFuzzyDHondtDirectOptimizeINF" + "Roulette1"
  taskID:str = "Web" + "ContextFuzzyDHondtDirectOptimizeINF" + "Fixed"
  dataset:ADataset = DatasetST.readDatasets()

  # selector:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT: 1})
  selector:ADHondtSelector = TheMostVotedItemSelector({})

  pToolOLin0802HLin1002:APenalization = PenalizationToolDefinition.exportProbPenaltyToolOLin0802HLin1002(
    InputSimulatorDefinition.numberOfAggrItems)

  rIDs, rDescs = InputRecomSTDefinition.exportPairOfRecomIdsAndRecomDescrs()

  history:AHistory = HistoryHierDF(taskID)

  # Init eTool
  evalTool:AEvalTool = EvalToolContext({
    EvalToolContext.ARG_ITEMS: dataset.serialsDF,  # ITEMS
    EvalToolContext.ARG_EVENTS: dataset.eventsDF,  # EVENTS (FOR CALCULATING HISTORY OF USER)
    EvalToolContext.ARG_DATASET: "st",  # WHAT DATASET ARE WE IN
    EvalToolContext.ARG_HISTORY: history})  # empty instance of AHistory is OK for ST dataset

  aDescDHont:AggregationDescription = InputAggrDefinition.exportADescDContextHondtDirectOptimizeINF(selector, pToolOLin0802HLin1002, evalTool)

  pDescr:Portfolio1AggrDescription = Portfolio1AggrDescription(
    taskID, rIDs, rDescs, aDescDHont)

  port:APortfolio = pDescr.exportPortfolio(taskID, history)
  port.train(history, dataset)

  model:DataFrame = PModelDHondt(pDescr.getRecommendersIDs())

  return (taskID, port, model, evalTool, history)
Exemple #3
0
def getFuzzyDHontINF():

  #taskID:str = "Web" + "FuzzyDHondtINF" + "Roulette1"
  taskID:str = "Web" + "FuzzyDHondt" + "Fixed"
  dataset:ADataset = DatasetST.readDatasets()

  #selector:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT: 1})
  selector:ADHondtSelector = TheMostVotedItemSelector({})

  pToolOLin0802HLin1002:APenalization = PenalizationToolDefinition.exportPenaltyToolOLin0802HLin1002(
    InputSimulatorDefinition.numberOfAggrItems)

  aDescDHont:AggregationDescription = InputAggrDefinition.exportADescDHondtINF(selector, pToolOLin0802HLin1002)

  rIDs, rDescs = InputRecomSTDefinition.exportPairOfRecomIdsAndRecomDescrs()

  pDescr:Portfolio1AggrDescription = Portfolio1AggrDescription(
    taskID, rIDs, rDescs, aDescDHont)

  history:AHistory = HistoryHierDF(taskID)

  port:APortfolio = pDescr.exportPortfolio(taskID, history)
  port.train(history, dataset)

  model:DataFrame = PModelDHondt(pDescr.getRecommendersIDs())

  evalTool:AEvalTool = EvalToolDHondt({EvalToolDHondt.ARG_LEARNING_RATE_CLICKS: 0.03,
                                        EvalToolDHondt.ARG_LEARNING_RATE_VIEWS: 0.03 / 500})

  return (taskID, port, model, evalTool, history)
Exemple #4
0
def getFuzzyDHontThompsonSamplingINF():

  taskID:str = "Web" + "FuzzyDHondtThompsonSamplingINF" + "Fixed" + "OLin0802HLin1002"

  selector:ADHondtSelector = TheMostVotedItemSelector({})

  penalization:APenalization = PenalizationToolDefinition.exportProbPenaltyToolOLin0802HLin1002(20)

  aDescDHont:AggregationDescription = InputAggrDefinition.exportADescDHondtThompsonSamplingINF(selector, penalization)

  rIDs, rDescs = InputRecomSTDefinition.exportPairOfRecomIdsAndRecomDescrs()

  pDescr:Portfolio1AggrDescription = Portfolio1AggrDescription(
    taskID, rIDs, rDescs, aDescDHont)

  history:AHistory = HistoryHierDF(taskID)

  dataset:ADataset = DatasetST.readDatasets()

  port:APortfolio = pDescr.exportPortfolio(taskID, history)
  port.train(history, dataset)

  model:DataFrame = PModelDHondtBanditsVotes(pDescr.getRecommendersIDs())

  evalTool:AEvalTool = EvalToolDHondtBanditVotes({})

  return (taskID, port, model, evalTool, history)
Exemple #5
0
def test01():
    print("Test 01")

    # number of recommended items
    N:int = 5

    methodsResultDict:dict = {
          "method1":pd.Series([0.5, 0.5, 0.4, 0.2],[1,2,3,4],name="rating"),
          "method2":pd.Series([0.9, 0.5, 0.1],[5,1,6],name="rating"),
          "method3":pd.Series([0.7, 0.3, 0.9], [3, 4, 6], name="rating")
    }


    # methods parametes
    modelDF:DataFrame = DataFrame({"votes": [0.5, 0.4, 0.1]}, index=["method1", "method2", "method3"])
    #print(modelDF)

    userID:int = 0

    aggr:AggrFuzzyDHondtDirectOptimize = AggrFuzzyDHondtDirectOptimize({
                    AggrFuzzyDHondtDirectOptimize.ARG_SELECTOR:TheMostVotedItemSelector({})
                    })

    #itemIDs:List[tuple] = aggr.runWithResponsibility(methodsResultDict, modelDF, userID, N)

    # [1, 3, 5, 2, 4]
    itemIDs:List[tuple] = aggr.run(methodsResultDict, modelDF, userID, N)

    print("itemIDs:" + str(itemIDs))
Exemple #6
0
    def getSelectorParameters(self):

        selectorRoulette1: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 1})
        selectorRoulette2: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 2})
        selectorRoulette3: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 3})
        selectorRoulette4: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 4})
        selectorRoulette5: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 5})
        selectorFixed: ADHondtSelector = TheMostVotedItemSelector({})

        aDict: Dict[str, object] = {}
        aDict[BatchDefMLFuzzyDHondtDirectOptimize.
              SLCTR_ROULETTE1] = selectorRoulette1
        aDict[BatchDefMLFuzzyDHondtDirectOptimize.
              SLCTR_ROULETTE2] = selectorRoulette2
        aDict[BatchDefMLFuzzyDHondtDirectOptimize.
              SLCTR_ROULETTE3] = selectorRoulette3
        aDict[BatchDefMLFuzzyDHondtDirectOptimize.
              SLCTR_ROULETTE4] = selectorRoulette4
        aDict[BatchDefMLFuzzyDHondtDirectOptimize.
              SLCTR_ROULETTE5] = selectorRoulette5
        aDict[BatchDefMLFuzzyDHondtDirectOptimize.SLCTR_FIXED] = selectorFixed

        aSubDict: Dict[str, object] = {
            selIdI: aDict[selIdI]
            for selIdI in aDict.keys() if selIdI in self.selectorIds
        }
        return aSubDict
Exemple #7
0
def test01():
    print("Test 01")

    # number of recommended items
    N = 120

    #a = observationalLinearProbabilityFnc(0.1, 0.9, 5)
    #print(a)

    uBehaviourDesc: UserBehaviourDescription = UserBehaviourDescription(
        observationalLinearProbabilityFnc, [0.1, 0.9])

    # method results, items=[1,2,4,5,6,7,8,12,32,64,77]
    methodsResultDict: dict[str, pd.Series] = {
        "metoda1":
        pd.Series([0.2, 0.1, 0.3, 0.3, 0.1], [32, 2, 8, 1, 4], name="rating"),
        "metoda2":
        pd.Series([0.1, 0.1, 0.2, 0.3, 0.3], [1, 5, 32, 6, 7], name="rating"),
        "metoda3":
        pd.Series([0.3, 0.1, 0.2, 0.3, 0.1], [7, 2, 77, 64, 12], name="rating")
    }
    #print(methodsResultDict)

    # methods parametes
    methodsParamsData: List[tuple] = [['metoda1', 100], ['metoda2', 80],
                                      ['metoda3', 60]]
    methodsParamsDF: DataFrame = pd.DataFrame(methodsParamsData,
                                              columns=["methodID", "votes"])
    methodsParamsDF.set_index("methodID", inplace=True)
    #print(methodsParamsDF)

    userID: int = 0
    itemID: int = 7

    historyDF: AHistory = HistoryDF("test01")
    historyDF.insertRecommendation(userID, itemID, 1, True, None)
    historyDF.insertRecommendation(userID, itemID, 1, True, None)
    historyDF.insertRecommendation(userID, itemID, 1, True, None)
    historyDF.print()

    #ignoringValue:float = historyDF.getIgnoringValue(userID, itemID, limit=3)
    #print("IgnoringValue: " + str(ignoringValue))

    penalization: APenalization = PenalUsingReduceRelevance(
        penaltyLinear, [0.8, 0.2, 3], penaltyLinear, [1.0, 0.2, 3], 3)

    aggr: AggrFuzzyDHondt = AggrFuzzyDHondtINF(
        historyDF, {
            AggrFuzzyDHondtINF.ARG_SELECTOR: TheMostVotedItemSelector({}),
            AggrFuzzyDHondtINF.ARG_PENALTY_TOOL: penalization
        })

    itemIDs: List[tuple] = aggr.runWithResponsibility(methodsResultDict,
                                                      methodsParamsDF, userID,
                                                      N)
    print(itemIDs)
    def getSelectorParameters(self):

        selectorRoulette1: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 1})
        selectorRoulette3: ADHondtSelector = RouletteWheelSelector(
            {RouletteWheelSelector.ARG_EXPONENT: 3})
        selectorFixed: ADHondtSelector = TheMostVotedItemSelector({})

        aDict: dict = {}
        aDict[BatchFuzzyDHondt.SLCTR_ROULETTE1] = selectorRoulette1
        aDict[BatchFuzzyDHondt.SLCTR_ROULETTE2] = selectorRoulette3
        aDict[BatchFuzzyDHondt.SLCTR_FIXED] = selectorFixed
        return aDict
def test01():

    print("Simulation: RR Dynamic")

    lrClick: float = 0.03
    #lrView:float = lrClick / 300
    lrViewDivisor: float = 250

    jobID: str = "Fixed" + "Clk" + str(lrClick).replace(
        ".", "") + "ViewDivisor" + str(lrViewDivisor).replace(".", "")

    selector: ADHondtSelector = TheMostVotedItemSelector({})

    rIDs, rDescs = InputRecomRRDefinition.exportPairOfRecomIdsAndRecomDescrs()

    p1AggrDescr: Portfolio1AggrDescription = Portfolio1AggrDescription(
        "FDHont" + jobID, rIDs, rDescs,
        InputAggrDefinition.exportADescDHondt(selector))

    recommenderID: str = "TheMostPopular"
    rDescr: RecommenderDescription = RecommenderDescription(
        RecommenderTheMostPopular, {})

    pDescr: APortfolioDescription = PortfolioDynamicDescription(
        "Dynamic" + "FDHontPersStat" + jobID, recommenderID, rDescr, "FDHondt",
        p1AggrDescr)

    batchID: str = "rrDiv90Ulinear0109R1"
    dataset: DatasetRetailRocket = DatasetRetailRocket.readDatasetsWithFilter(
        minEventCount=50)
    behaviourFile: str = BehavioursRR.getFile(BehavioursRR.BHVR_LINEAR0109)
    behavioursDF: DataFrame = BehavioursRR.readFromFileRR(behaviourFile)

    model: DataFrame = PModelDHondtPersonalisedStat(
        p1AggrDescr.getRecommendersIDs())

    eTool: AEvalTool = EvalToolDHondtPersonal({
        EvalToolDHondt.ARG_LEARNING_RATE_CLICKS:
        lrClick,
        EvalToolDHondt.ARG_LEARNING_RATE_VIEWS:
        lrClick / lrViewDivisor
    })

    # simulation of portfolio
    simulator: Simulator = Simulator(batchID, SimulationRR, argsSimulationDict,
                                     dataset, behavioursDF)
    simulator.simulate([pDescr], [model], [eTool],
                       [HistoryHierDF(pDescr.getPortfolioID())])
    def getAllSelectors(self):

        selectorRoulette1:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT:1})
        selectorRoulette2:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT:2})
        selectorRoulette3:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT:3})
        selectorRoulette4:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT:4})
        selectorRoulette5:ADHondtSelector = RouletteWheelSelector({RouletteWheelSelector.ARG_EXPONENT:5})
        selectorFixed:ADHondtSelector = TheMostVotedItemSelector({})

        aDict:Dict[str,object] = {}
        aDict[BatchDefMLFuzzyDHondt.SLCTR_ROULETTE1] = selectorRoulette1
        aDict[BatchDefMLFuzzyDHondt.SLCTR_ROULETTE2] = selectorRoulette2
        aDict[BatchDefMLFuzzyDHondt.SLCTR_ROULETTE3] = selectorRoulette3
        aDict[BatchDefMLFuzzyDHondt.SLCTR_ROULETTE4] = selectorRoulette4
        aDict[BatchDefMLFuzzyDHondt.SLCTR_ROULETTE5] = selectorRoulette5
        aDict[BatchDefMLFuzzyDHondt.SLCTR_FIXED] = selectorFixed

        return aDict
Exemple #11
0
def test01():
    print("Test 01")

    # number of recommended items
    N = 120

    # method results, items=[1,2,4,5,6,7,8,12,32,64,77]
    methodsResultDict: dict[str, pd.Series] = {
        "metoda1":
        pd.Series([0.2, 0.1, 0.3, 0.3, 0.1], [32, 2, 8, 1, 4], name="rating"),
        "metoda2":
        pd.Series([0.1, 0.1, 0.2, 0.3, 0.3], [1, 5, 32, 6, 7], name="rating"),
        "metoda3":
        pd.Series([0.3, 0.1, 0.2, 0.3, 0.1], [7, 2, 77, 64, 12], name="rating")
    }
    print(methodsResultDict)

    # methods parametes
    portfolioModelData: List[tuple] = [['metoda1', 100], ['metoda2', 80],
                                       ['metoda3', 60]]
    portfolioModel: DataFrame = pd.DataFrame(portfolioModelData,
                                             columns=["methodID", "votes"])
    portfolioModel.set_index("methodID", inplace=True)

    sumMethodsVotes: float = portfolioModel["votes"].sum()
    for methodIdI in portfolioModel.index:
        portfolioModel.loc[
            methodIdI,
            "votes"] = portfolioModel.loc[methodIdI, "votes"] / sumMethodsVotes

    aggr: AggrFuzzyDHondt = AggrFuzzyDHondt(
        HistoryDF(""),
        {AggrFuzzyDHondt.ARG_SELECTOR: TheMostVotedItemSelector({})})
    #itemIDs:int = aggr.run(methodsResultDict, methodsParamsDF, N)
    #print(itemIDs)

    userID: int = 101
    itemIDs: List[tuple] = aggr.runWithResponsibility(methodsResultDict,
                                                      portfolioModel, userID,
                                                      N)
    print(itemIDs)
def test03():
    # First get Dataset Data
    dataset: ADataset = DatasetST.readDatasets()
    events = dataset.eventsDF
    serials = dataset.serialsDF

    # I created some dummy data, but each key,value pair should be result list from a recommender
    #   (=what recommender recommended)
    methodsResultDict: dict = {
        "metoda1":
        pd.Series([0.2, 0.1, 0.3, 0.3, 0.1], [32, 2, 8, 1, 4], name="rating"),
        "metoda2":
        pd.Series([0.1, 0.1, 0.2, 0.3, 0.3], [1, 5, 32, 6, 7], name="rating")
    }

    # init votes for each recommender
    portfolioModelData = [['metoda1', 0.6], ['metoda2', 0.4]]
    portfolioModelDF: DataFrame = pd.DataFrame(portfolioModelData,
                                               columns=["methodID", "votes"])
    portfolioModelDF.set_index("methodID", inplace=True)

    userID = 1
    itemID = 20
    historyDF: AHistory = HistoryDF("test01")

    # WHAT EVALUATIOR NEEDS into dictionary!
    evaluationDict: dict = {
        EvalToolContext.ARG_USER_ID: userID,
        EvalToolContext.ARG_ITEM_ID:
        itemID,  # ITEMID (not mandatory if EvalToolContext.ARG_PAGE_TYPE != "zobrazit")
        EvalToolContext.ARG_SENIORITY: 5,  # SENIORITY OF USER
        EvalToolContext.ARG_PAGE_TYPE:
        "zobrazit",  #   TYPE OF PAGE ("zobrazit", "index" or "katalog)
        EvalToolContext.ARG_ITEMS_SHOWN: 10  # HOW MANY ITEMS ARE SHOWN TO USER
    }
    # Init eTool
    eToolContext = EvalToolContext({
        EvalToolContext.ARG_ITEMS: serials,  # ITEMS
        EvalToolContext.ARG_EVENTS:
        events,  # EVENTS (FOR CALCULATING HISTORY OF USER)
        EvalToolContext.ARG_DATASET: "st",  # WHAT DATASET ARE WE IN
        EvalToolContext.ARG_HISTORY: historyDF
    }  # empty instance of AHistory is OK for ST dataset
                                   )
    aggr: AggrContextFuzzyDHondt = AggrContextFuzzyDHondt(
        historyDF,
        {  # empty instance of AHistory is OK for ST dataset
            AggrContextFuzzyDHondt.ARG_EVAL_TOOL: eToolContext,  # eTool
            AggrContextFuzzyDHondt.ARG_SELECTOR: TheMostVotedItemSelector(
                {})  # ? FuzzyDHondt needs this, not contextAggr
        })

    # Get data from aggregator
    rItemsWithResponsibility = aggr.runWithResponsibility(
        methodsResultDict,
        portfolioModelDF,
        userID,
        numberOfItems=5,
        argumentsDict=evaluationDict)
    # call click & displayed methods
    l1 = eToolContext.displayed(rItemsWithResponsibility, portfolioModelDF,
                                evaluationDict)
    # rItemsWithResponsibility[0][0] is clicked item
    print(rItemsWithResponsibility)
    l1 = eToolContext.click(rItemsWithResponsibility,
                            rItemsWithResponsibility[0][0], portfolioModelDF,
                            evaluationDict)

    # ...
    # ...
    # ...
    # user is now on "index" page type, so we have to change page type in evaluationDict (!)
    evaluationDict[EvalToolContext.ARG_PAGE_TYPE] = "index"

    # same as before
    # Get data from aggregator
    rItemsWithResponsibility = aggr.runWithResponsibility(
        methodsResultDict,
        portfolioModelDF,
        userID,
        numberOfItems=5,
        argumentsDict=evaluationDict)
    # call click & displayed methods
    l1 = eToolContext.displayed(rItemsWithResponsibility, portfolioModelDF,
                                evaluationDict)
    # rItemsWithResponsibility[0][0] is clicked item
    l1 = eToolContext.click(rItemsWithResponsibility,
                            rItemsWithResponsibility[0][0], portfolioModelDF,
                            evaluationDict)
def test02(repetitions=1):
    N = 100

    # get dataset
    itemsDF: DataFrame = Items.readFromFileMl1m()
    usersDF: DataFrame = Users.readFromFileMl1m()
    ratingsDF: DataFrame = Ratings.readFromFileMl1m()

    ratingsDFTrain = ratingsDF[:50000]
    ratingsDFUpdate: DataFrame = ratingsDF.iloc[50001:50100]

    trainDataset: ADataset = DatasetML("ml", ratingsDFTrain, usersDF, itemsDF)

    historyDF: AHistory = HistoryDF("test01")

    # train KNN
    rec1: ARecommender = RecommenderItemBasedKNN("run", {})
    rec1.train(HistoryDF("test01"), trainDataset)

    # train Most Popular
    rec2: ARecommender = RecommenderTheMostPopular("run", {})
    rec2.train(historyDF, trainDataset)

    # methods parametes
    methodsParamsData: List[tuple] = [['ItembasedKNN', 0.4],
                                      ['MostPopular', 0.6]]
    methodsParamsDF: DataFrame = pd.DataFrame(methodsParamsData,
                                              columns=["methodID", "votes"])
    methodsParamsDF.set_index("methodID", inplace=True)

    userID = 352
    ratingsDFuserID = ratingsDF[ratingsDF['userId'] == userID]
    itemID = ratingsDFuserID.iloc[0]['movieId']

    historyDF: AHistory = HistoryDF("test01")
    historyDF.insertRecommendation(userID, itemID, 1, True, 10)

    r1: Series = rec1.recommend(userID, N, {})
    r2: Series = rec2.recommend(userID, N, {})

    methodsResultDict: dict = {"ItembasedKNN": r1, "MostPopular": r2}
    evaluationDict: dict = {
        EvalToolContext.ARG_USER_ID: userID,
        EvalToolContext.ARG_RELEVANCE: methodsResultDict
    }
    evalToolDHondt = EvalToolContext({
        EvalToolContext.ARG_USERS: usersDF,
        EvalToolContext.ARG_ITEMS: itemsDF,
        EvalToolContext.ARG_DATASET: "ml",
        EvalToolContext.ARG_HISTORY: historyDF
    })

    aggr: AggrContextFuzzyDHondt = AggrContextFuzzyDHondt(
        historyDF, {
            AggrContextFuzzyDHondt.ARG_EVAL_TOOL: evalToolDHondt,
            AggrContextFuzzyDHondt.ARG_SELECTOR: TheMostVotedItemSelector({})
        })
    aggrInit: AggrFuzzyDHondt = AggrFuzzyDHondt(
        historyDF,
        {AggrFuzzyDHondt.ARG_SELECTOR: TheMostVotedItemSelector({})})
    l1 = aggrInit.runWithResponsibility(methodsResultDict, methodsParamsDF,
                                        userID, N)
    import random

    print("l1:" + str(l1))
    evalToolDHondt.displayed(l1, methodsParamsDF, evaluationDict)
    evalToolDHondt.click(l1,
                         random.choice(l1)[0], methodsParamsDF, evaluationDict)
    timestamp = 10
    counter = 0
    r1c = 0
    r2c = 0
    for _ in range(repetitions):
        for index, row in ratingsDFuserID.iterrows():
            r1: Series = rec1.recommend(userID, N, {})
            r2: Series = rec2.recommend(userID, N, {})
            methodsResultDict: dict = {"ItembasedKNN": r1, "MostPopular": r2}
            evalDict = {"a": 1}
            historyDF.insertRecommendation(userID, row['movieId'], 1, True,
                                           timestamp)
            timestamp += 1
            l1 = aggr.runWithResponsibility(methodsResultDict,
                                            methodsParamsDF,
                                            userID,
                                            argumentsDict=evalDict,
                                            numberOfItems=N)
            import random
            randomItem = random.choice(l1)[0]
            if randomItem in r1.index:
                r1c += 1
            if randomItem in r2.index:
                r2c += 1
            evaluationDict: dict = {
                EvalToolContext.ARG_USER_ID: userID,
                EvalToolContext.ARG_RELEVANCE: methodsResultDict
            }
            print("votes Items: ", r1c)
            print("votes mostPopular ", r2c)
            evalToolDHondt.displayed(l1, methodsParamsDF, evaluationDict)
            evalToolDHondt.click(l1, randomItem, methodsParamsDF,
                                 evaluationDict)
            rec1.update(ratingsDFuserID.loc[[index]], {})
            # rec2.update(ratingsDFuserID.loc[index]) Not implemented
            #print("Counter = ", counter, "; All = ", len(ratingsDFuserID.iloc[800:]), "; Index: ", index)
            print(methodsParamsDF)
            counter += 1
def test01():
    print("Test 01")

    recommenderID: str = "TheMostPopular"
    pRDescr: RecommenderDescription = RecommenderDescription(
        RecommenderTheMostPopular, {})

    selectorFixed: ADHondtSelector = TheMostVotedItemSelector({})
    aDescDHont: AggregationDescription = InputAggrDefinition.exportADescDHondtDirectOptimizeThompsonSampling(
        selectorFixed)

    rIDs: List[str]
    rDescs: List[AggregationDescription]
    rIDs, rDescs = InputRecomRRDefinition.exportPairOfRecomIdsAndRecomDescrs()
    rIDs = [recommenderID]
    rDescs = [pRDescr]

    p1AggrDescrID: str = "p1AggrDescrID"
    p1AggrDescr: Portfolio1AggrDescription = Portfolio1AggrDescription(
        p1AggrDescrID, rIDs, rDescs, aDescDHont)

    pProbTool: APenalization = PenalizationToolDefinition.exportProbPenaltyToolOLin0802HLin1002(
        InputSimulatorDefinition.numberOfAggrItems)
    pProbTool: APenalization = PenalizationToolDefinition.exportPenaltyToolOStat08HLin1002(
        InputSimulatorDefinition.numberOfAggrItems)

    aHierDescr: AggregationDescription = AggregationDescription(
        AggrD21, {AggrD21.ARG_RATING_THRESHOLD_FOR_NEG: 2.0})

    pHierDescr: PortfolioHierDescription = PortfolioHierDescription(
        "pHierDescr", recommenderID, pRDescr, p1AggrDescrID, p1AggrDescr,
        aHierDescr, pProbTool)

    userID: int = 1

    dataset: ADataset = DatasetRetailRocket.readDatasetsWithFilter(
        minEventCount=50)

    history: AHistory = HistoryDF("test")
    history.insertRecommendation(userID, 45, 1, False)
    history.insertRecommendation(userID, 45, 2, False)
    history.insertRecommendation(userID, 78, 3, False)

    p: APortfolio = pHierDescr.exportPortfolio("test", history)

    portFolioModel: DataFrame = PModelDHondtBanditsVotes(
        p1AggrDescr.getRecommendersIDs())

    p.train(history, dataset)

    #df:DataFrame = DataFrame([[1, 555]], columns=[Events.COL_USER_ID, Events.COL_OBJECT_ID])
    #p.update(ARecommender.UPDT_CLICK, df)

    args = {
        APortfolio.ARG_NUMBER_OF_AGGR_ITEMS: 20,
        APortfolio.ARG_ITEM_ID: 1,
        APortfolio.ARG_NUMBER_OF_RECOMM_ITEMS: 100,
        AggrD21.ARG_RATING_THRESHOLD_FOR_NEG: 0.5
    }

    r, rp = p.recommend(userID, portFolioModel, args)
    print(r)