Exemplo n.º 1
0
        public NeuralAIv3(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.NeuralV3;

            specificUpdateKey = new RequestedInfoKey(false);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentage);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumTableSeats_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_GameStage_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);

            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToCallAmount_Amount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealAmount_Amount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToBotCheck_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToBotCall_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_FoldToBotCall_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealSuccess_Prob);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumRaises_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumCalls_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumChecks_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_ImmediatePotOdds_Double);

            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppRaiseFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppCallFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppPreFlopPlayFreq_Double);
        }
Exemplo n.º 2
0
        internal SimpleAIv7(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.SimpleV7;

            //Setup this AI's specific update key
            specificUpdateKey = new RequestedInfoKey(false);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsMatchedPlayability);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_DealerDistance_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerMoneyInPot_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerHandStartingStackAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumCalls_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_ProbOpponentHasBetterWRFIXED);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallStealSuccessProb);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealSuccessProb);

            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggr_Double);
        }
Exemplo n.º 3
0
 internal SimpleAIv5(AIRandomControl aiRandomControl)
     : base(aiRandomControl)
 {
     specificUpdateKey = new RequestedInfoKey();
     specificUpdateKey.SetInfoTypeRequired(InfoProviders.InfoType.WR_ModelAction);
     specificUpdateKey.SetInfoTypeRequired(InfoProviders.InfoType.WR_ModelActionAmount);
 }
Exemplo n.º 4
0
        public NeuralAIv6(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.NeuralV6;

            //Setup this AI's specific update key
            specificUpdateKey = new RequestedInfoKey(false);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_GameStage_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAAPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsKKPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAK_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOtherHighPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOtherLowPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsTroubleHand_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsMidConnector_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsLowConnector_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsSuited_Bool);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_DealerDistance_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerMoneyInPot_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerHandStartingStackAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_LastAdditionalRaiseAmount);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_ProbOpponentHasBetterWRFIXED);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallAmount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealAmount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallStealSuccessProb);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealSuccessProb);

            //specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealSuccess_Prob);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToCallAmount_Amount);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealAmount_Amount);

            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppPreFlopPlayFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppPostFlopPlayFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggr_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggrAcc_Double);

            ////The following mostly used by PAP
            //specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumTableSeats_Byte);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_FlushPossible_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_StraightPossible_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_AOnBoard_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_KOnBoard_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_AKQToBoardRatio_Real);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_LastAdditionalRaiseAmount);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_BetsToCall_Byte);
        }
Exemplo n.º 5
0
        public SimpleAIV1(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.SimpleV1;

            specificUpdateKey = new RequestedInfoKey(false);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentage);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinRatio);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
        }
Exemplo n.º 6
0
        public NeuralAIv2(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.NeuralV2;

            specificUpdateKey = new RequestedInfoKey(false);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToCallAmount_Amount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentage);
        }
Exemplo n.º 7
0
        public NeuralAIv4(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.NeuralV4;

            //Setup this AI's specific update key
            specificUpdateKey = new RequestedInfoKey(false);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsMatchedPlayability);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_GameStage_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_DealerDistance_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_ImmediatePotOdds_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerMoneyInPot_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerHandStartingStackAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumRaises_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumCalls_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumChecks_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_ScaledCallAmount_Double);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_ProbOpponentHasBetterWRFIXED);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentage);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentageIndex);

            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealSuccess_Prob);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppRaiseFreq_Double);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppCallFreq_Double);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppPreFlopPlayFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToCallAmount_Amount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealAmount_Amount);

            //The following mostly used by PAP
            //specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumTableSeats_Byte);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_FlushPossible_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_StraightPossible_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_AOnBoard_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_KOnBoard_Bool);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.CP_AKQToBoardRatio_Real);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_LastAdditionalRaiseAmount);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_BetsToCall_Byte);

            //The fixing metrics
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_ProbOpponentHasBetterWRFIXED);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallAmount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealAmount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallStealSuccessProb);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealSuccessProb);
        }
        public SimpleAIV4AggTrack(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.SimpleV4AggressionTrack;

            specificUpdateKey = new RequestedInfoKey(false);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentage);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinRatio);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToCallAmount_Amount);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealAmount_Amount);

            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgScaledOppPreFlopPlayFreq_Double);
        }
Exemplo n.º 9
0
        private void AIManagerConstructor(int numInstances, AIRandomControl aiRandomControl, bool runInSafeMode, Object jobToRun)
        {
            RunInSafeMode = runInSafeMode;

            InfoProviderBase.CurrentJob = jobToRun;
            this.decisionRequestQueue   = new Queue();

            instanceSelector = new InstanceSelector();
            aiInstanceList   = new List <AIInstance>();

            //Setup the instances
            for (int i = 0; i < numInstances; i++)
            {
                aiInstanceList.Add(new AIInstance(instanceSelector, i, decisionRequestQueue, aiRandomControl));
            }

            for (int i = 0; i < numInstances; i++)
            {
                instanceSelector.instancesIdle = instanceSelector.instancesIdle | (1 << i);
            }
        }
Exemplo n.º 10
0
        public AIBase(AIRandomControl aiRandomControl)
        {
            //this.disableStochasticChoice = disableStochasticChoice;
            this.aiRandomControl         = aiRandomControl;
            defaultInfoTypeUpdateConfigs = new Dictionary <InfoType, string>();

            if (aiRandomControl.DecisionRandomPerHandSeedEnabled)
            {
                randomGen = new CMWCRandom(aiRandomControl.DecisionRandomPerHandSeed);
            }
            else
            {
                randomGen = new CMWCRandom();
            }

            //This set's all info types required to true and disables the few which are never used
            defaultUpdateKey = new RequestedInfoKey(true);
            defaultUpdateKey.SetInfoTypeRequired(InfoType.IO_ImpliedPotOdds_Double, false);
            defaultUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWeightedPercentage, false);
            defaultUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWeightedOpponentWinPercentage, false);
            defaultUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToBotRaise_Prob, false);
            defaultUpdateKey.SetInfoTypeRequired(InfoType.WR_AveragePercievedProbBotHasBetterHand, false);
        }
Exemplo n.º 11
0
 internal SimpleAIv6(AIRandomControl aiRandomControl)
     : base(aiRandomControl)
 {
     specificUpdateKey = new RequestedInfoKey();
     specificUpdateKey.SetInfoTypeRequired(InfoProviders.InfoType.WR_ProbOpponentHasBetterWR);
 }
Exemplo n.º 12
0
 public AIManager(int providersTimeOutMilliSeconds, int numInstances, AIRandomControl aiRandomControl, bool runInSafeMode)
 {
     AIManagerConstructor(numInstances, aiRandomControl, runInSafeMode, null);
 }
Exemplo n.º 13
0
        public GameProvider(InfoCollection information, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
            : base(information, InfoProviderType.Game, allInformationProviders, aiRandomControl)
        {
            requiredInfoTypes = new List <InfoType>()
            {
            };
            providedInfoTypes = new List <InfoPiece> {
                new InfoPiece(InfoType.GP_NumTableSeats_Byte, 10),
                new InfoPiece(InfoType.GP_NumPlayersDealtIn_Byte, 10),
                new InfoPiece(InfoType.GP_NumActivePlayers_Byte, 10),
                new InfoPiece(InfoType.GP_NumUnactedPlayers_Byte, 0),
                new InfoPiece(InfoType.GP_GameStage_Byte, 0),
                new InfoPiece(InfoType.GP_DealerDistance_Byte, 1)
            };

            AddProviderInformationTypes();
        }
Exemplo n.º 14
0
 public NeuralAIBase(AIRandomControl aiRandomControl)
     : base(aiRandomControl)
 {
     threadSafeNetworkDict = new Dictionary <string, NNThreadSafeNetworkPool>();
 }
Exemplo n.º 15
0
        public ImpliedOddsProvider(InfoCollection information, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
            : base(information, InfoProviderType.ImpliedOdds, allInformationProviders, aiRandomControl)
        {
            //requiredInfoProviders = new List<InfoProviderType>() {InfoProviderType.PlayerActionPrediction};
            providedInfoTypes = new List <InfoPiece>()
            {
                new InfoPiece(InfoType.IO_ImpliedPotOdds_Double, 0),
            };

            /*
             * requiredInfoTypes = new List<InfoType>() { InfoType.BP_MinimumCallAmount_Decimal,          //Provided
             *                                          InfoType.BP_TotalPotAmount_Decimal,             //Provided
             *                                          InfoType.GP_GameStage_Byte,
             *                                          InfoType.PAP_FoldToBotCall_Prob,
             *                                          InfoType.BP_PlayerBetAmountCurrentRound_Decimal,
             *                                          InfoType.BP_ImmediatePotOdds_Double,
             *                                          InfoType.GP_NumUnactedPlayers_Byte,
             *                                          };
             */
            AddProviderInformationTypes();
        }
Exemplo n.º 16
0
        public InfoProviderBase(InfoCollection information, InfoProviderType providerType, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
        {
            //this.disableTrueRandomness = disableTrueRandomness;
            this.aiRandomControl = aiRandomControl;

            if (allInformationProviders == null)
            {
                this.providerInitialisationSequenceNum = 1;
            }
            else
            {
                this.providerInitialisationSequenceNum = allInformationProviders.Count + 1;
            }

            if (aiRandomControl.InfoProviderRandomPerHandSeedEnabled)
            {
                this.randomGen = new CMWCRandom(aiRandomControl.InfoProviderRandomPerHandSeed);
            }
            else
            {
                this.randomGen = new CMWCRandom(DateTime.Now.Ticks + providerInitialisationSequenceNum);
            }

            this.providerType            = providerType;
            this.allInformationProviders = allInformationProviders;

            if (this.allInformationProviders != null)
            {
                this.allInformationProviders.Add(providerType, this);
            }

            //We need to check that dependant providers have already been added
            //This code is here but it does not seem to be useable
            if (requiredInfoProviders != null)
            {
                int numRequiredProviders = requiredInfoProviders.Count;

                int requiredInfoProvidersPresent = (from
                                                    availableProviders in allInformationProviders.Values
                                                    join requiredProviders in requiredInfoProviders on availableProviders.ProviderType equals requiredProviders
                                                    select availableProviders).Count();

                if (numRequiredProviders != requiredInfoProvidersPresent)
                {
                    throw new Exception("Required information providers for this provider are not yet present.");
                }
            }

            if (information != null)
            {
                this.infoStore = information;
            }
            else if (requiredInfoTypes != null)
            {
                throw new Exception("InfoStore and GlobalRequestedInfo Types must both be provided or neither, not one or the other.");
            }

            //We need to check that the requiredInfoTypes are already in the infoStore
            if (requiredInfoTypes != null && information != null)
            {
                int numRequiredInfoTypes = requiredInfoTypes.Count;

                int requiredInfoTypesPresent = (from
                                                availableInformation in infoStore.GetInformationStore().Keys
                                                join requiredTypes in requiredInfoTypes on availableInformation equals requiredTypes
                                                select infoStore).Count();

                if (numRequiredInfoTypes != requiredInfoTypesPresent)
                {
                    throw new Exception("Required information types for this provider are not yet present in the information store.");
                }
            }
            else if (requiredInfoTypes != null && information == null)
            {
                throw new Exception("If requiredInfoTypes is not null an infoStore MUST be used!");
            }

            //Setup the slow update function delegates
            lock (slowUpdateLocker)
            {
                if (!slowUpdateTaskDelegates.ContainsKey(providerType))
                {
                    slowUpdateTaskDelegates.Add(providerType, ProviderSlowUpdateTask);
                }
            }
        }
Exemplo n.º 17
0
        //protected databaseCache.AIConfig botConfig;

        public SimpleAIBase(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
        }
Exemplo n.º 18
0
        public NeuralAIv7(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.NeuralV7;

            #region preflop update key
            //Setup this AI's specific update key
            specificUpdateKey = new RequestedInfoKey(false);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_GameStage_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAAPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsKKPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAK_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOtherHighPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOtherLowPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsTroubleHand_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsMidConnector_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsLowConnector_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsSuited_Bool);

            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_DealerDistance_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerMoneyInPot_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerHandStartingStackAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_ProbOpponentHasBetterWRFIXED);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallAmount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealAmount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallStealSuccessProb);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealSuccessProb);

            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppPreFlopPlayFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppPostFlopPlayFreq_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggr_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggrAcc_Double);
            #endregion

            #region postflop update key
            postFlopUpdateKey = new RequestedInfoKey(false);

            postFlopUpdateKey.SetInfoTypeRequired(InfoType.GP_GameStage_Byte);

            postFlopUpdateKey.SetInfoTypeRequired(InfoType.GP_DealerDistance_Byte);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);

            postFlopUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerMoneyInPot_Decimal);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerHandStartingStackAmount_Decimal);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);

            postFlopUpdateKey.SetInfoTypeRequired(InfoType.WR_ProbOpponentHasBetterWRFIXED);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallAmount);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealAmount);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToCallStealSuccessProb);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.WR_RaiseToStealSuccessProb);

            postFlopUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppPreFlopPlayFreq_Double);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppPostFlopPlayFreq_Double);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggr_Double);
            postFlopUpdateKey.SetInfoTypeRequired(InfoType.AP_AvgLiveOppCurrentRoundAggrAcc_Double);
            #endregion
        }
Exemplo n.º 19
0
        public AggressionProvider(InfoCollection information, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
            : base(information, InfoProviderType.AIAggression, allInformationProviders, aiRandomControl)
        {
            requiredInfoTypes = new List <InfoType>()
            {
            };
            providedInfoTypes = new List <InfoPiece> {
                //Old scaled values
                new InfoPiece(InfoType.AP_AvgScaledOppRaiseFreq_Double, 0),
                new InfoPiece(InfoType.AP_AvgScaledOppCallFreq_Double, 0),
                new InfoPiece(InfoType.AP_AvgScaledOppPreFlopPlayFreq_Double, 0),

                //New live values including accuracy
                new InfoPiece(InfoType.AP_AvgLiveOppPreFlopPlayFreq_Double, 0),
                new InfoPiece(InfoType.AP_AvgLiveOppPostFlopPlayFreq_Double, 0),
                new InfoPiece(InfoType.AP_AvgLiveOppCurrentRoundAggr_Double, 0),
                new InfoPiece(InfoType.AP_AvgLiveOppCurrentRoundAggrAcc_Double, 0),
            };

            AddProviderInformationTypes();

            lock (locker)
            {
                if (CurrentJob == null)
                {
                    playerAggressionCache = new List <PlayerAggression>();
                }
                else
                {
                    //For now we will just start a blank list but we should be using the serialised data in the job.
                    playerAggressionCache = new List <PlayerAggression>();
                }
            }
        }
Exemplo n.º 20
0
            public AIInstance(InstanceSelector instanceSelector, int instanceNumber, Queue decisionRequestQueue, AIRandomControl aiRandomControl)
            {
                taskTrees = new Dictionary <RequestedInfoKey, InfoProviderTaskTree>();

                this.instanceSelector     = instanceSelector;
                this.instanceNumber       = instanceNumber;
                this.decisionRequestQueue = decisionRequestQueue;
                this.decisionInProgress   = new object();

                //Setup the AI's and providers here
                infoStore = new InfoCollection();

                infoProviderDictList = new Dictionary <InfoProviderType, InfoProviderBase>();
                aiDictList           = new Dictionary <AIGeneration, AIBase>();

                //Setup the 1st infostore instance
                var GP   = new GameProvider(infoStore, infoProviderDictList, aiRandomControl);
                var WRP  = new ProviderWinRatio.WinRatioProvider(infoStore, infoProviderDictList, aiRandomControl);
                var BP   = new BetsProvider(infoStore, infoProviderDictList, aiRandomControl);
                var CP   = new CardsProvider(infoStore, infoProviderDictList, aiRandomControl);
                var AP   = new AggressionProvider(infoStore, infoProviderDictList, aiRandomControl);
                var PAPP = new PlayerActionPredictionProvider(infoStore, infoProviderDictList, aiRandomControl);

                //Hard lock the infostore collection preventing any further changes.
                infoStore.HardLockInfoList();

                //Setup the AI list
                //We are going to lock the AI's into random mode.
                aiDictList.Add(AIGeneration.SimpleV1, new SimpleAIV1(aiRandomControl));
                aiDictList.Add(AIGeneration.SimpleV2, new SimpleAIV2(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV1, new NeuralAIv1(aiRandomControl));
                aiDictList.Add(AIGeneration.SimpleV3, new SimpleAIV3(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV2, new NeuralAIv2(aiRandomControl));
                aiDictList.Add(AIGeneration.SimpleV4AggressionTrack, new SimpleAIV4AggTrack(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV3, new NeuralAIv3(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV4, new NeuralAIv4(aiRandomControl));
                aiDictList.Add(AIGeneration.SimpleV5, new SimpleAIv5(aiRandomControl));
                aiDictList.Add(AIGeneration.SimpleV6, new SimpleAIv6(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV5, new NeuralAIv5(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV6, new NeuralAIv6(aiRandomControl));
                aiDictList.Add(AIGeneration.SimpleV7, new SimpleAIv7(aiRandomControl));
                aiDictList.Add(AIGeneration.CheatV1, new CheatV1(aiRandomControl));
                aiDictList.Add(AIGeneration.NeuralV7, new NeuralAIv7(aiRandomControl));

                if (ConcurrencyMode.Concurrency == ConcurrencyMode.ConcurencyModel.MultiCore)
                {
                    providerTasks = new Dictionary <InfoProviderType, Task>();
                }
                else
                {
                    providerActions = new Dictionary <InfoProviderType, Action>();
                }
            }
Exemplo n.º 21
0
        public BetsProvider(InfoCollection information, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
            : base(information, InfoProviderType.Bets, allInformationProviders, aiRandomControl)
        {
            providedInfoTypes = new List <InfoPiece>()
            {
                new InfoPiece(InfoType.BP_BetsToCall_Byte, 5),
                new InfoPiece(InfoType.BP_LastRoundBetsToCall_Byte, 0),
                new InfoPiece(InfoType.BP_MinimumPlayAmount_Decimal, 0),
                new InfoPiece(InfoType.BP_PlayerHandStartingStackAmount_Decimal, 0),
                new InfoPiece(InfoType.BP_PlayerLastAction_Short, (byte)Definitions.PokerAction.CatastrophicError),
                new InfoPiece(InfoType.BP_PlayerMoneyInPot_Decimal, 0),
                new InfoPiece(InfoType.BP_TotalNumCalls_Byte, 5),
                new InfoPiece(InfoType.BP_TotalNumRaises_Byte, 5),
                new InfoPiece(InfoType.BP_TotalPotAmount_Decimal, 1),
                new InfoPiece(InfoType.BP_CalledLastRound_Bool, 0),
                new InfoPiece(InfoType.BP_RaisedLastRound_Bool, 0),
                new InfoPiece(InfoType.BP_PlayerBetAmountCurrentRound_Decimal, 0),
                new InfoPiece(InfoType.BP_ImmediatePotOdds_Double, 0),
                new InfoPiece(InfoType.BP_TotalNumChecks_Byte, 0),
                new InfoPiece(InfoType.BP_CurrentCallAmountLarger4BB, 1),
                new InfoPiece(InfoType.BP_LastAdditionalRaiseAmount, 0),
                new InfoPiece(InfoType.BP_ScaledCallAmount_Double, 1)
            };

            AddProviderInformationTypes();
        }
Exemplo n.º 22
0
        public CardsProvider(InfoCollection information, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
            : base(information, InfoProviderType.Cards, allInformationProviders, aiRandomControl)
        {
            requiredInfoTypes = new List <InfoType>()
            {
            };
            providedInfoTypes = new List <InfoPiece> {
                new InfoPiece(InfoType.CP_AOnBoard_Bool, 1),
                new InfoPiece(InfoType.CP_KOnBoard_Bool, 1),
                new InfoPiece(InfoType.CP_FlushPossible_Bool, 1),
                new InfoPiece(InfoType.CP_StraightPossible_Bool, 1),
                new InfoPiece(InfoType.CP_AKQToBoardRatio_Real, 1),
                new InfoPiece(InfoType.CP_TableStraightDraw_Bool, 1),
                new InfoPiece(InfoType.CP_TableFlushDraw_Bool, 1),

                new InfoPiece(InfoType.CP_HoleCardsAAPair_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsKKPair_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsOtherHighPair_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsOtherLowPair_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsOtherPair_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsAK_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsTroubleHand_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsMidConnector_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsLowConnector_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsSuited_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsFlushDraw_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsStraightDraw_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsOuterStraightDrawWithHC_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsInnerStraightDrawWithHC_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCards3KindOrBetterMadeWithHC_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsTopOrTwoPair_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsAOrKInHand_Bool, 0),
                new InfoPiece(InfoType.CP_HoleCardsMatchedPlayability, 0),
            };

            AddProviderInformationTypes();

            LoadCardUsage("Marc");
            LoadCardUsage("Ailwyn");
            LoadCardUsage("SimpleV7");
            LoadCardUsage("CheatV1");
        }
Exemplo n.º 23
0
        public PlayerActionPredictionProvider(InfoCollection information, Dictionary <InfoProviderType, InfoProviderBase> allInformationProviders, AIRandomControl aiRandomControl)
            : base(information, InfoProviderType.PlayerActionPrediction, allInformationProviders, aiRandomControl)
        {
            requiredInfoTypes = new List <InfoType>()
            {
                InfoType.CP_AKQToBoardRatio_Real,                                       //Same for all
                InfoType.CP_AOnBoard_Bool,                                              //Same for all
                InfoType.CP_FlushPossible_Bool,                                         //Same for all
                InfoType.CP_KOnBoard_Bool,                                              //Same for all
                InfoType.CP_StraightPossible_Bool,                                      //Same for all
                InfoType.GP_GameStage_Byte,                                             //Same for all
                InfoType.GP_NumActivePlayers_Byte,                                      //Provided
                InfoType.GP_NumPlayersDealtIn_Byte,                                     //Same for all
                InfoType.GP_NumTableSeats_Byte,                                         //Same for all
                InfoType.GP_NumUnactedPlayers_Byte,                                     //Provided
                InfoType.BP_BetsToCall_Byte,                                            //Provided
                InfoType.BP_LastRoundBetsToCall_Byte,                                   // ********* From CACHE
                InfoType.BP_MinimumPlayAmount_Decimal,                                  //Provided
                InfoType.BP_PlayerLastAction_Short,                                     // ********* From CACHE
                InfoType.BP_PlayerMoneyInPot_Decimal,                                   // ********* From CACHE
                InfoType.BP_TotalNumCalls_Byte,                                         //Provided
                InfoType.BP_TotalNumRaises_Byte,                                        //Provided
                InfoType.BP_TotalPotAmount_Decimal,                                     //Provided
                InfoType.BP_LastAdditionalRaiseAmount,
                InfoType.GP_DealerDistance_Byte,                                        // ********* From CACHE
                InfoType.AP_AvgScaledOppPreFlopPlayFreq_Double                          //We don't actually need this we just want to make sure the agression provider has been added
            };

            providedInfoTypes = new List <InfoPiece>()
            {
                new InfoPiece(InfoType.PAP_RaiseToStealAmount_Amount, 0),
                new InfoPiece(InfoType.PAP_RaiseToStealSuccess_Prob, 0),
                new InfoPiece(InfoType.PAP_RaiseToCallAmount_Amount, 0),
                new InfoPiece(InfoType.PAP_RaiseToBotCall_Prob, 1),
                new InfoPiece(InfoType.PAP_FoldToBotCall_Prob, 0),
                new InfoPiece(InfoType.PAP_RaiseToBotCheck_Prob, 1),
            };
            AddProviderInformationTypes();

            //Create the player action prediction network manager if it's has not already been created.
            if (networkManager == null)
            {
                networkManager = new playerActionPredictionNetworkManager();
            }

#if logging
            //If we are logging configure the logger
            ILoggerRepository            repository             = LogManager.GetRepository(Assembly.GetCallingAssembly());
            IBasicRepositoryConfigurator configurableRepository = repository as IBasicRepositoryConfigurator;

            PatternLayout layout = new PatternLayout();
            layout.ConversionPattern = "%level% [%thread%] - %message%newline";
            layout.ActivateOptions();

            FileAppender appender = new FileAppender();
            appender.Layout       = layout;
            appender.File         = "aiDecisions_PAP.csv";
            appender.AppendToFile = true;
            appender.ActivateOptions();
            configurableRepository.Configure(appender);
#endif
        }
Exemplo n.º 24
0
        public NeuralAIv1(AIRandomControl aiRandomControl)
            : base(aiRandomControl)
        {
            aiType = AIGeneration.NeuralV1;

            specificUpdateKey = new RequestedInfoKey(false);

            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAAPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsKKPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAK_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOtherHighPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOtherLowPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsTroubleHand_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsMidConnector_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsLowConnector_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsSuited_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsFlushDraw_Bool);

            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsOuterStraightDrawWithHC_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsInnerStraightDrawWithHC_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsTopOrTwoPair_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCardsAOrKInHand_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_HoleCards3KindOrBetterMadeWithHC_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_AOnBoard_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_KOnBoard_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_AKQToBoardRatio_Real);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_FlushPossible_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_StraightPossible_Bool);

            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_TableStraightDraw_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.CP_TableFlushDraw_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumPlayersDealtIn_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumTableSeats_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumActivePlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_NumUnactedPlayers_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_GameStage_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.GP_DealerDistance_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_ImmediatePotOdds_Double);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerMoneyInPot_Decimal);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerHandStartingStackAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalPotAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumRaises_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumCalls_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_TotalNumChecks_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_LastRoundBetsToCall_Byte);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_CurrentCallAmountLarger4BB);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_RaisedLastRound_Bool);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerLastAction_Short);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentage);

            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyOpponentWinPercentage);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyWinPercentageLastRoundChange);
            specificUpdateKey.SetInfoTypeRequired(InfoType.WR_CardsOnlyOpponentWinPercentage);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToBotCheck_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToBotCall_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_FoldToBotCall_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealSuccess_Prob);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToStealAmount_Amount);
            specificUpdateKey.SetInfoTypeRequired(InfoType.PAP_RaiseToCallAmount_Amount);

            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            specificUpdateKey.SetInfoTypeRequired(InfoType.BP_PlayerBetAmountCurrentRound_Decimal);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);

            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
            //specificUpdateKey.SetInfoTypeRequired(InfoType.BP_MinimumPlayAmount_Decimal);
        }