/** * { * var progress = new Progress<int>(percent => * { * textBox1.Text = percent + "%"; * }); * * // DoProcessing is run on the thread pool. * await Task.Run(() => DoProcessing(progress)); * textBox1.Text = "Done!"; * } * * public void DoProcessing(IProgress<int> progress) */ public PlayerModel estimatePlayerModel(PlayerStats playerStats) { BaseModel baseModel = estimateBaseModel(playerStats); DifferencePair[] similarOppPreFlop = getSimilarOpponents_PreFlop(baseModel.VPIP, baseModel.PFR); DifferencePair[] similarOppPostFlop = getSimilarOpponents_PostFlop(baseModel.Aggression, baseModel.WTP); var allPreFlopParams = PreFlopParams.getAllParams(TableType); var preFlopAD = new EstimatedAD[allPreFlopParams.Count]; for (int i = 0; i < allPreFlopParams.Count; i++) { preFlopAD[i] = estimateADPreFLop(playerStats, similarOppPreFlop, allPreFlopParams[i]); } var allPostFlopParams = PostFlopParams.getAllParams(TableType); var postFlopAD = new EstimatedAD[allPostFlopParams.Count]; for (int i = 0; i < allPostFlopParams.Count; i++) { postFlopAD[i] = estimateADPostFlop(playerStats, similarOppPostFlop, allPostFlopParams[i]); } return(new PlayerModel(TableType, baseModel.VPIP, baseModel.PFR, baseModel.WTP, baseModel.Aggression, preFlopAD, postFlopAD)); }
public PlayerStats(string playerName, PokerClient client, TableType tableType, int vpipPositive, int vpipTotal, ActionStats[] preFlopAD, ActionStats[] postFlopAD) { PlayerName = playerName; Client = client; _tableType = tableType; VPIP = new StatValue(vpipPositive, vpipTotal); _allPreFlopParams = PreFlopParams.getAllParams(tableType); _allPostFlopParams = PostFlopParams.getAllParams(tableType); PreFlopStats = preFlopAD; PostFlopStats = postFlopAD; }
public PlayerStats(string playerName, PokerClient client, TableType tableType) { PlayerName = playerName; Client = client; _tableType = tableType; VPIP = new StatValue(); _allPreFlopParams = PreFlopParams.getAllParams(_tableType); _allPostFlopParams = PostFlopParams.getAllParams(_tableType); PreFlopStats = new ActionStats[_allPreFlopParams.Count]; PostFlopStats = new ActionStats[_allPostFlopParams.Count]; for (int i = 0; i < PreFlopStats.Length; i++) { PreFlopStats[i] = new ActionStats(); } for (int i = 0; i < PostFlopStats.Length; i++) { PostFlopStats[i] = new ActionStats(); } }
public void increment(Hand hand) { Debug.Assert(hand.Client == Client); Debug.Assert(hand.PlayersNames.Count <= (int)_tableType); var allInList = new List <string>(); var activePlayerList = new List <string>(hand.PlayersNames); int playerIndex = activePlayerList.FindIndex(name => name == PlayerName); if (playerIndex < 0) { return; } Position position = getPlayerPosition(activePlayerList, PlayerName); var lastPlayerAction = ActionType.Fold; bool playerPutMoneyInPot = false; bool playerFoldedOrAllIn = false; // Pre-Flop { int numRaises = 0; int numCallers = 0; foreach (Action a in hand.ActionList.Where(a => a.Street == Street.PreFlop && a.IsValidAction)) { if (playerFoldedOrAllIn || activePlayerList.Count <= 1) { break; } if (a.PlayerName == PlayerName) { int numPlayers = activePlayerList.Count + allInList.Count; var preFlopParams = new PreFlopParams(_tableType, position, numCallers, numRaises, numPlayers, lastPlayerAction, inPosition(activePlayerList, a.PlayerName, numPlayers)); getPreFlopStats(preFlopParams).addSample(a.Type); if (a.Type == ActionType.Fold || a.Type == ActionType.AllIn) { playerFoldedOrAllIn = true; } if (a.IsRaiseAction || a.Type == ActionType.Call) { playerPutMoneyInPot = true; } lastPlayerAction = a.Type; } else { if (a.Type == ActionType.Fold) { activePlayerList.Remove(a.PlayerName); } else if (a.Type == ActionType.AllIn) { activePlayerList.Remove(a.PlayerName); allInList.Add(a.PlayerName); } } if (a.IsRaiseAction) { numRaises++; numCallers = 0; } else if (a.Type == ActionType.Call) { numCallers++; } } } // VPIP VPIP.AddSample(playerPutMoneyInPot); // For each remaining streets for (var currentStreet = Street.Flop; currentStreet <= Street.River; currentStreet++) { if (playerFoldedOrAllIn || activePlayerList.Count <= 1) { break; } int round = 0; int numRaises = 0; // For each action on current street foreach (Action a in hand.ActionList.Where(a => (a.Street == currentStreet) && a.IsValidAction)) { if (a.PlayerName == PlayerName) { var numPlayers = activePlayerList.Count + allInList.Count; var postFlopParams = new PostFlopParams(_tableType, currentStreet, round, lastPlayerAction, numRaises, inPosition(activePlayerList, a.PlayerName, numPlayers), numPlayers); //round == 1 && lastPlayerAction == ActionType.Check && postFlopParams.InPosition == true getPostFlopStats(postFlopParams).addSample(a.Type); if (a.Type == ActionType.Fold || a.Type == ActionType.AllIn) { playerFoldedOrAllIn = true; break; } lastPlayerAction = a.Type; round++; } else { if (a.Type == ActionType.Fold) { activePlayerList.Remove(a.PlayerName); } else if (a.Type == ActionType.AllIn) { activePlayerList.Remove(a.PlayerName); allInList.Add(a.PlayerName); } } if (a.IsRaiseAction) { numRaises++; } } } }
public ActionStats getPostFlopStats(PostFlopParams postFlopParams) { Debug.Assert(postFlopParams.TableType == _tableType); return(PostFlopStats[postFlopParams.ToIndex()]); }
public EstimatedAD GetAD(PostFlopParams prms) { return(Model.GetPostFlopAD(prms.ToIndex())); }
private EstimatedAD estimateADPostFlop(PlayerStats playerStats, DifferencePair[] sortedOpponents, PostFlopParams postFlopParams) { Debug.Assert(playerStats != null); var priorBetRaise = new HistDistribution(_options.priorNumBins); var priorCheckCall = new HistDistribution(_options.priorNumBins); var priorFold = new HistDistribution(_options.priorNumBins); var cumulativeActionsStats = new ActionStats(); int k = 0; for (int i = 0; (i < sortedOpponents.Length) && (k < _options.maxSimilarPlayers) && (k == 0 || sortedOpponents[i].Difference < _options.maxDifference); i++) { int playerInd = sortedOpponents[i].Index; if (_baseModels[playerInd].Aggression.Sigma < _options.maxBaseStatsSigma) { ActionStats similarOponentStats = _fullStatsList[playerInd].getPostFlopStats(postFlopParams); if (similarOponentStats.totalSamples() > _options.minSamples) { priorBetRaise.AddSample(similarOponentStats.betRaiseProbability()); priorCheckCall.AddSample(similarOponentStats.checkCallProbability()); priorFold.AddSample(similarOponentStats.foldProbability()); k++; } else { cumulativeActionsStats.append(similarOponentStats); } if (cumulativeActionsStats.totalSamples() > _options.minSamples) { priorBetRaise.AddSample(cumulativeActionsStats.betRaiseProbability()); priorCheckCall.AddSample(cumulativeActionsStats.checkCallProbability()); priorFold.AddSample(cumulativeActionsStats.foldProbability()); cumulativeActionsStats.clear(); k++; } } } priorBetRaise.Normalize(); priorCheckCall.Normalize(); priorFold.Normalize(); // Update prior sa statistikom igraca ActionStats startStats = playerStats.getPostFlopStats(postFlopParams); var estBetRaise = estimateGaussian(priorBetRaise, startStats.BetRaiseSamples, startStats.totalSamples()); var estCheckCall = estimateGaussian(priorCheckCall, startStats.CheckCallSamples, startStats.totalSamples()); var estFold = estimateGaussian(priorFold, startStats.FoldSamples, startStats.totalSamples()); if (postFlopParams.ForcedAction()) { var totalMean = estBetRaise.Mean + estCheckCall.Mean + estFold.Mean; var scale = 1.0f / totalMean; estBetRaise = estBetRaise.Scale(scale); estCheckCall = estCheckCall.Scale(scale); estFold = estFold.Scale(scale); } else { var totalMean = estBetRaise.Mean + estCheckCall.Mean; var scale = 1.0f / totalMean; estBetRaise = estBetRaise.Scale(scale); estCheckCall = estCheckCall.Scale(scale); estFold = new GaussianDistribution(0.0f, 0.0f); } return(new EstimatedAD(estBetRaise, estCheckCall, estFold, k, startStats.totalSamples())); }