/// <summary>
        ///   The name last action in sequence.
        /// </summary>
        /// <param name="actionSequence">
        ///   The action sequence.
        /// </param>
        /// <returns>
        ///   The name last action in sequence.
        /// </returns>
        /// <exception cref="NotSupportedException"></exception>
        public static string NameLastActionInSequence(ActionSequences actionSequence)
        {
            if (Folds.Contains(actionSequence))
            {
                return("Fold");
            }

            if (Calls.Contains(actionSequence))
            {
                return("Call");
            }

            if (Raises.Contains(actionSequence))
            {
                return("Raise");
            }

            if (Bets.Contains(actionSequence))
            {
                return("Bet");
            }

            if (actionSequence == ActionSequences.HeroX)
            {
                return("Check");
            }

            throw new NotSupportedException("Cannot name last action of " + actionSequence);
        }
Exemple #2
0
        public static IAnalyzablePokerPlayer AnalyzablePokerPlayerWith(long id, ActionSequences actionSequence, Streets street, StrategicPositions strategicPosition)
        {
            var analyzablePokerPlayer = (AnalyzablePokerPlayer)AnalyzablePokerPlayerWith(id, actionSequence, street, false);

            analyzablePokerPlayer.StrategicPosition = strategicPosition;
            return(analyzablePokerPlayer);
        }
Exemple #3
0
 public AnalyzablePokerPlayer()
 {
     InPosition       = new bool?[(int)(Streets.River + 1)];
     ActionSequences  = new ActionSequences[(int)(Streets.River + 1)];
     BetSizeIndexes   = new int[(int)(Streets.River + 1)];
     _sequenceStrings = new string[(int)(Streets.River + 1)];
 }
Exemple #4
0
        public override string ToString()
        {
            var sb =
                new StringBuilder(
                    string.Format(
                        "Id: {0}, BB: {1}, Ante: {2}, TimeStamp: {3}, TotalPlayers: {4}, HandId: {5}, MBefore: {6}, Position: {7}, StrategicPosition: {8}, Holecards: {9}",
                        Id,
                        BB,
                        Ante,
                        TimeStamp,
                        TotalPlayers,
                        HandId,
                        MBefore,
                        Position,
                        StrategicPosition,
                        Holecards));

            sb.AppendLine("\nInPosition");
            InPosition.ToList().ForEach(sp => sb.Append(sp.ToString() + " "));
            sb.AppendLine("\nActionSequences");
            ActionSequences.ToList().ForEach(seq => sb.Append(seq.ToString() + " "));
            sb.AppendLine("\nBetSizeIndexes");
            BetSizeIndexes.ToList().ForEach(bs => sb.Append(bs.ToString() + " "));
            sb.AppendLine("\nSequences");
            Sequences.ToList().ForEach(seq => sb.Append(seq.ToStringNullSafe() + "\n"));

            return(sb.ToString());
        }
        /// <summary>
        ///   The get last action in.
        /// </summary>
        /// <param name="actionSequence">
        ///   The action sequence.
        /// </param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static ActionTypes GetLastActionIn(ActionSequences actionSequence)
        {
            if (Folds.Contains(actionSequence))
            {
                return(ActionTypes.F);
            }

            if (Calls.Contains(actionSequence))
            {
                return(ActionTypes.C);
            }

            if (Raises.Contains(actionSequence))
            {
                return(ActionTypes.R);
            }

            if (Checks.Contains(actionSequence))
            {
                return(ActionTypes.X);
            }

            if (Bets.Contains(actionSequence))
            {
                return(ActionTypes.B);
            }

            throw new ArgumentException(actionSequence + " has no last Action");
        }
        static string DescribeAction(ActionSequences actionSequence)
        {
            string possibleCheck = ActionSequencesUtility.GetHeroChecksThenReacts.Contains(actionSequence)
                                       ? ActionTypesUtility.Name(ActionTypes.X).ToLower() + "-"
                                       : string.Empty;

            return(possibleCheck + ActionSequencesUtility.NamePastTenseOfLastActionSequence(actionSequence) +
                   " a " + ActionTypesUtility.Name(ActionTypes.B).ToLower());
        }
Exemple #7
0
 protected override IActionSequenceStatisticsSet NewActionSequenceSetStatistics(
     IPercentagesCalculator percentagesCalculator,
     IEnumerable <IActionSequenceStatistic> statistics,
     string playerName,
     Streets street,
     ActionSequences actionSequence,
     bool inPosition)
 {
     return(_stub.Out <IActionSequenceStatisticsSet>());
 }
Exemple #8
0
        public void PrepareAnalyzationFor_PreFlopUnraisedPotAndFirstMatchingHeroActionIsAtIndexOne_StartingActionIndexIsOne(
            [Values("[1]C,[2]F,[3]C", "[1]C,[2]C,[3]C", "[1]C,[2]R,[3]C")] string sequenceString,
            [Values(ActionSequences.HeroF, ActionSequences.HeroC, ActionSequences.HeroR)] ActionSequences actionSequence)
        {
            IConvertedPokerRound sequence = sequenceString.ToConvertedPokerRoundWithIds();

            _sut.PrepareAnalyzationFor(sequence, HeroPosition, actionSequence);

            _sut.StartingActionIndex.ShouldBeEqualTo(1);
        }
Exemple #9
0
        public void PrepareAnalyzationFor_FlopHeroXOppBAndFirstMatchingHeroReactionIsAtIndexTwo_StartingActionIndexIsTwo(
            [Values("[2]X,[1]B,[2]F", "[2]X,[1]B,[2]C", "[2]X,[1]B,[2]R")] string sequenceString,
            [Values(ActionSequences.HeroXOppBHeroF, ActionSequences.HeroXOppBHeroC, ActionSequences.HeroXOppBHeroR)] ActionSequences actionSequence)
        {
            IConvertedPokerRound sequence = sequenceString.ToConvertedPokerRoundWithIds();

            _sut.PrepareAnalyzationFor(sequence, HeroPosition, actionSequence);

            _sut.StartingActionIndex.ShouldBeEqualTo(2);
        }
Exemple #10
0
 protected virtual IActionSequenceStatisticsSet NewActionSequenceSetStatistics(
     IPercentagesCalculator percentagesCalculator,
     IEnumerable <IActionSequenceStatistic> statistics,
     string playerName,
     Streets street,
     ActionSequences actionSequence,
     bool inPosition)
 {
     return(new ActionSequenceStatisticsSet(percentagesCalculator, statistics, playerName, street, actionSequence, inPosition));
 }
Exemple #11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ActionSequenceStatisticsSet"/> class.
 ///   Creates instance of ActionSequenceStatisticsSet.
 ///   Use for PreFlop Statistics only
 /// </summary>
 /// <param name="percentagesCalculator">
 /// </param>
 /// <param name="statistics">
 /// </param>
 /// <param name="playerName">
 /// <see cref="IActionSequenceStatisticsSet.PlayerName"/>
 /// </param>
 /// <param name="actionSequence">
 /// <see cref="IActionSequenceStatisticsSet.ActionSequence"/>
 /// </param>
 /// <param name="raisedPot">
 /// <see cref="IActionSequenceStatisticsSet.RaisedPot"/>
 /// </param>
 public ActionSequenceStatisticsSet(
     IPercentagesCalculator percentagesCalculator,
     IEnumerable <IActionSequenceStatistic> statistics,
     string playerName,
     ActionSequences actionSequence,
     bool raisedPot)
     : this(percentagesCalculator, statistics, playerName, Streets.PreFlop, actionSequence, false)
 {
     RaisedPot = raisedPot;
 }
        public string Describe(string playerName, IAnalyzablePokerPlayer analyzablePokerPlayer, Streets street, ITuple <double, double> ratioSizes)
        {
            ActionSequences actionSequence = analyzablePokerPlayer.ActionSequences[(int)street];

            return(string.Format("{0} {1} ({2} of the pot), when {3} on the {4}, and was reraised",
                                 playerName,
                                 DescribeAction(actionSequence),
                                 PostFlopRaiseReactionDescriberUtils.DescribeBetSizes(ratioSizes),
                                 StatisticsDescriberUtils.DescribePosition(analyzablePokerPlayer, street),
                                 street.ToString().ToLower()));
        }
        public static string NamePastTenseOfLastActionSequence(ActionSequences actionSequence)
        {
            ActionTypes lastAction = GetLastActionIn(actionSequence);

            return
                (lastAction.Match()
                 .With(a => a == ActionTypes.F, _ => "folded")
                 .With(a => a == ActionTypes.C, _ => "called")
                 .With(a => a == ActionTypes.R, _ => "raised")
                 .Do());
        }
        public string Hint(string playerName, ActionSequences actionSequence, bool inPosition)
        {
            var sb = new StringBuilder(string.Format("The table shows how {0} acted when sitting in a certain position at the table.", playerName));

            if (actionSequence == ActionSequences.PreFlopNoFrontRaise)
            {
                sb.AppendLine("A check from the big blind is counted as a fold.");
            }

            return(sb.ToString());
        }
Exemple #15
0
        internal static IAnalyzablePokerPlayer AnalyzablePokerPlayerWith(long id, ActionSequences actionSequence, Streets street, bool inPosition, int betSizeIndex)
        {
            IAnalyzablePokerPlayer analyzablePokerPlayer = new AnalyzablePokerPlayer {
                Id = id
            };

            analyzablePokerPlayer.ActionSequences[(int)street] = actionSequence;
            analyzablePokerPlayer.InPosition[(int)street]      = inPosition;
            analyzablePokerPlayer.BetSizeIndexes[(int)street]  = betSizeIndex;

            return(analyzablePokerPlayer);
        }
        bool FoundMatchFor(string pattern, ActionSequences actionSequence)
        {
            Match match = Regex.Match(_sequenceString, pattern, RegexOptions.IgnoreCase);

            if (match.Success)
            {
                ActionSequence = actionSequence;
                BetSizeIndex   = StandardizedBetSizes.IndexOf(System.Convert.ToInt32(match.Groups["BetSizeKey"].Value));
                return(true);
            }

            return(false);
        }
Exemple #17
0
        protected ActionSequenceStatistic(ActionSequences actionSequence, Streets street, int indexesCount)
        {
            _actionSequence = actionSequence;
            _street         = street;

            Percentages = new int[indexesCount];

            MatchingPlayers = new List <IAnalyzablePokerPlayer> [indexesCount];
            for (int i = 0; i < MatchingPlayers.Length; i++)
            {
                MatchingPlayers[i] = new List <IAnalyzablePokerPlayer>();
            }
        }
Exemple #18
0
        double[] SelectRatioAccordingTo(ActionSequences actionSequence)
        {
            switch (actionSequence)
            {
            case ActionSequences.HeroC:
                return(_unraisedPotCallingRatios);

            case ActionSequences.OppRHeroC:
                return(_raisedPotCallingRatios);

            default:
                return(_raiseSizeKeys);
            }
        }
        void PrepareAnalyzation(ActionSequences actionSequence)
        {
            try
            {
                SetStartingActionIndex(actionSequence);

                WasSuccessful = true;
            }
            catch (Exception excep)
            {
                Log.Error(excep);
                WasSuccessful = false;
            }
        }
Exemple #20
0
        public void AnalyzeUsingDataFrom_OnlyOneOpponentRaisedAndMoreActionsAfterHerosReaction_IsStandardSituationIsTrue(
            [Values("[2]B,[1]R3.0,[2]F,[4]R2.0", "[1]B,[2]R,[1]R3.0,[2]F,[4]R2.0", "[2]X,[1]B,[2]R,[1]R3.0,[2]F,[4]R2.0"
                    )] string sequenceString,
            [Values(ActionSequences.HeroB, ActionSequences.OppBHeroR, ActionSequences.HeroXOppBHeroR)] ActionSequences
            actionSequence)
        {
            IConvertedPokerRound sequence = sequenceString.ToConvertedPokerRoundWithIds();

            _analyzationPreparer.PrepareAnalyzationFor(sequence, HeroPosition, actionSequence);

            _sut.AnalyzeUsingDataFrom(_stub.Out <IAnalyzablePokerPlayer>(), _analyzationPreparer, true, _raiseSizes);

            _sut.IsStandardSituation.ShouldBeTrue();
        }
Exemple #21
0
        public void SelectedActionSequence_OneCellWithOppBHeroRDataSelected_ReturnsOppBHeroR()
        {
            const ActionSequences actionSequence = ActionSequences.OppBHeroR;
            var statisticStub = _stub.Setup <IActionSequenceStatistic>()
                                .Get(s => s._actionSequence).Returns(actionSequence)
                                .Out;
            var statisticSetStub = _stub.Setup <IActionSequenceStatisticsSet>()
                                   .Get(s => s.ActionSequenceStatistics).Returns(new[] { statisticStub })
                                   .Out;

            _sut.InitializeWith(statisticSetStub)
            .AddToSelection(0, 0);

            _sut.SelectedActionSequence.ShouldBeEqualTo(actionSequence);
        }
Exemple #22
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ActionSequenceStatisticsSet"/> class.
 ///   Creates instance of ActionSequenceStatisticsSet.
 ///   Use for PostFlop Statistics only
 /// </summary>
 /// <param name="percentagesCalculator">
 /// </param>
 /// <param name="statistics">
 /// </param>
 /// <param name="playerName">
 /// <see cref="IActionSequenceStatisticsSet.PlayerName"/>
 /// </param>
 /// <param name="street">
 /// <see cref="IActionSequenceStatisticsSet.Street"/>
 /// </param>
 /// <param name="actionSequence">
 /// <see cref="IActionSequenceStatisticsSet.ActionSequence"/>
 /// </param>
 /// <param name="inPosition">
 /// <see cref="IActionSequenceStatisticsSet.InPosition"/>
 /// </param>
 public ActionSequenceStatisticsSet(
     IPercentagesCalculator percentagesCalculator,
     IEnumerable <IActionSequenceStatistic> statistics,
     string playerName,
     Streets street,
     ActionSequences actionSequence,
     bool inPosition)
 {
     _percentagesCalculator = percentagesCalculator;
     _statistics            = statistics;
     ActionSequence         = actionSequence;
     PlayerName             = playerName;
     Street     = street;
     InPosition = inPosition;
 }
Exemple #23
0
        public IPreFlopHandStrengthStatistics BuildStatisticsFor(
            IEnumerable <IAnalyzablePokerPlayer> analyzablePokerPlayers, ActionSequences actionSequence)
        {
            RatiosUsed = SelectRatioAccordingTo(actionSequence);

            AnalyzablePlayersWithKnownCards =
                analyzablePokerPlayers.Where(p => !string.IsNullOrEmpty(p.Holecards) && !p.Holecards.Contains('?'));

            SortAnalyzablePlayersWithKnownCardsByColumn();

            ExtractAndValueTheirHoleCards();

            DetermineAverageChenValuesAndSklanskyMalmuthGroupings();

            return(this);
        }
Exemple #24
0
        public void UpdateWith_OneMatchingPlayer_MatchingPlayersForOtherPositionDoNotContainPlayer()
        {
            const long               id             = 1;
            const Streets            street         = Streets.PreFlop;
            const ActionSequences    actionSequence = ActionSequences.HeroC;
            const StrategicPositions position       = StrategicPositions.CO;

            _sut = new PreFlopActionSequenceStatistic(actionSequence);

            var player = Samples.AnalyzablePokerPlayerWith(id, actionSequence, street, position);

            _analyzablePokerPlayers.Add(player);

            _sut.UpdateWith(_analyzablePokerPlayers);

            _sut.MatchingPlayers[(int)position + 1].ShouldNotContain(player);
        }
Exemple #25
0
        public void UpdateWith_PlayerWithHeroXOppBHeroReacts_PlayerIsIncludedInMatchingPlayers(
            [Values(ActionSequences.HeroXOppBHeroF, ActionSequences.HeroXOppBHeroC, ActionSequences.HeroXOppBHeroR)]
            ActionSequences actionSequence)
        {
            const long    id         = 1;
            const bool    inPosition = false;
            const Streets street     = Streets.Flop;

            var sut = new PostFlopHeroXStatistic(street, inPosition);

            var player = Samples.AnalyzablePokerPlayerWith(id, actionSequence, street, inPosition);

            _analyzablePokerPlayers.Add(player);

            sut.UpdateWith(_analyzablePokerPlayers);

            sut.MatchingPlayers[0].ShouldContain(player);
        }
Exemple #26
0
        public void UpdateWith_OneMatchingPlayer_MatchingPlayersForOtherBetSizeDoNotContainPlayer()
        {
            const long            id             = 1;
            const bool            inPosition     = false;
            const Streets         street         = Streets.Flop;
            const ActionSequences actionSequence = ActionSequences.OppBHeroC;
            const int             betSizeIndex   = 1;

            _sut = new PostFlopActionSequenceStatistic(actionSequence, street, inPosition, indexesCount);

            var player = Samples.AnalyzablePokerPlayerWith(id, actionSequence, street, inPosition, betSizeIndex);

            _analyzablePokerPlayers.Add(player);

            _sut.UpdateWith(_analyzablePokerPlayers);

            _sut.MatchingPlayers[betSizeIndex + 1].ShouldNotContain(player);
        }
Exemple #27
0
        public void UpdateWith_TwoPlayersOneMatchingPlayer_MatchingPlayersForGivenPositionContainMatchingPlayer()
        {
            const long               id             = 1;
            const Streets            street         = Streets.PreFlop;
            const ActionSequences    actionSequence = ActionSequences.HeroC;
            const StrategicPositions position       = StrategicPositions.CO;

            _sut = new PreFlopActionSequenceStatistic(actionSequence);

            var matchingPlayer    = Samples.AnalyzablePokerPlayerWith(id, actionSequence, street, position);
            var notMatchingPlayer = Samples.AnalyzablePokerPlayerWith(id + 1, actionSequence + 1, street, position);

            _analyzablePokerPlayers.Add(matchingPlayer);
            _analyzablePokerPlayers.Add(notMatchingPlayer);

            _sut.UpdateWith(_analyzablePokerPlayers);

            _sut.MatchingPlayers[(int)position].ShouldContain(matchingPlayer);
        }
        public IRaiseReactionStatistics Build(
            IEnumerable <IAnalyzablePokerPlayer> analyzablePokerPlayers,
            ActionSequences actionSequence,
            Streets street,
            bool considerOpponentsRaiseSize)
        {
            if (analyzablePokerPlayers.Count() < 1)
            {
                throw new ArgumentException("need at least one analyzable player");
            }

            analyzablePokerPlayers.ForEach(
                analyzablePlayer => _raiseReactionsAnalyzer.AnalyzeAndAdd(_raiseReactionAnalyzerMake.New,
                                                                          analyzablePlayer,
                                                                          street,
                                                                          actionSequence,
                                                                          considerOpponentsRaiseSize));

            return(_raiseReactionStatistics.InitializeWith(_raiseReactionsAnalyzer));
        }
Exemple #29
0
        public void UpdateWith_TwoPlayersOneMatchingPlayer_MatchingPlayersForGivenBetSizeContainMatchingPlayer()
        {
            const long            id             = 1;
            const bool            inPosition     = false;
            const Streets         street         = Streets.Flop;
            const ActionSequences actionSequence = ActionSequences.OppBHeroC;
            const int             betSizeIndex   = 1;

            _sut = new PostFlopActionSequenceStatistic(actionSequence, street, inPosition, indexesCount);

            var matchingPlayer    = Samples.AnalyzablePokerPlayerWith(id, actionSequence, street, inPosition, betSizeIndex);
            var notMatchingPlayer = Samples.AnalyzablePokerPlayerWith(id + 1, actionSequence + 1, street, inPosition, betSizeIndex);

            _analyzablePokerPlayers.Add(matchingPlayer);
            _analyzablePokerPlayers.Add(notMatchingPlayer);

            _sut.UpdateWith(_analyzablePokerPlayers);

            _sut.MatchingPlayers[betSizeIndex].ShouldContain(matchingPlayer);
        }
        void SetStartingActionIndex(ActionSequences actionSequence)
        {
            ActionTypes actionToLookFor = ActionSequencesUtility.GetLastActionIn(actionSequence);

            IEnumerable <IConvertedPokerActionWithId> foundAction
                = from IConvertedPokerActionWithId action in Sequence
                  where
                  action.What.Equals(actionToLookFor) &&
                  action.Id.Equals(HeroPosition)
                  select action;

            if (foundAction.Count() > 0)
            {
                StartingActionIndex = Sequence.Actions.IndexOf(foundAction.First());
            }
            else
            {
                throw new ArgumentException("Couldn't find action: " + actionToLookFor);
            }
        }