Exemple #1
0
        public void CalculateNewEstimates()
        {
            SqlConnection connection = new SqlConnection(_connectionString);

            connection.Open();
            SqlTransaction transaction = connection.BeginTransaction();
            var            jtlGateway  = new JamTimeLimitGateway(connection, transaction);

            if (_jams == null)
            {
                _jams = new JamGateway(connection, transaction).GetUnestimatedJams();
            }
            if (_penaltyGroups == null)
            {
                _penaltyGroups = new PenaltyGroupGateway(connection, transaction).GetUnestimatedPenaltyGroups();
            }
            Dictionary <int, int> jamBoutMap;
            Dictionary <int, Jam> jamMap;
            Dictionary <int, IGrouping <int, PenaltyGroup> > penaltyGroupMap;

            // we only want the jams that haven't already been estimated
            var estimatedJams = jtlGateway.GetAllJamTimeEstimates().ToDictionary(jte => jte.JamID);
            var neededJams    = _jams.Where(j => !estimatedJams.ContainsKey(j.ID));

            jamBoutMap      = neededJams.ToDictionary(j => j.ID, j => j.BoutID);
            jamMap          = neededJams.ToDictionary(j => j.ID);
            _penaltyGroups  = _penaltyGroups.Where(pg => jamMap.ContainsKey(pg.BoxTimes.First().JamID)).ToList();
            penaltyGroupMap = _penaltyGroups.GroupBy(pg => jamBoutMap[pg.BoxTimes.First().JamID]).ToDictionary(gp => gp.Key);

            var boutJams = jamMap.Values.GroupBy(j => j.BoutID);

            var jamEstimateMap = CalculateJamDurationLimits(connection, transaction, jamMap);

            foreach (IGrouping <int, Jam> boutJamSet in boutJams)
            {
                ProcessBout(boutJamSet, penaltyGroupMap[boutJamSet.Key], jamEstimateMap);
            }
            var boxTimeEstimates = CalculateBoxTimeEstimates(jamEstimateMap);

            jtlGateway.InsertJamTimeEstimates(jamEstimateMap.Values, false);
            new BoxTimeEstimateGateway(connection, transaction).InsertBoxTimeEstimates(boxTimeEstimates, false);
            transaction.Commit();
            connection.Close();
        }
Exemple #2
0
        public void CalculateDurationEstimates()
        {
            SqlConnection connection = new SqlConnection(_connectionString);

            connection.Open();
            SqlTransaction transaction = connection.BeginTransaction();
            var            jtlGateway  = new JamTimeLimitGateway(connection, transaction);

            if (_jams == null)
            {
                _jams = new JamGateway(connection, transaction).GetAllJams();
            }
            if (_penaltyGroups == null)
            {
                _penaltyGroups = new PenaltyGroupGateway(connection, transaction).GetAllPenaltyGroups();
            }
            Dictionary <int, int> jamBoutMap;
            Dictionary <int, Jam> jamMap;
            Dictionary <int, IGrouping <int, PenaltyGroup> > penaltyGroupMap;

            jamBoutMap      = _jams.ToDictionary(j => j.ID, j => j.BoutID);
            jamMap          = _jams.ToDictionary(j => j.ID);
            penaltyGroupMap = _penaltyGroups.GroupBy(pg => jamBoutMap[pg.BoxTimes.First().JamID]).ToDictionary(gp => gp.Key);

            var boutJams = jamMap.Values.GroupBy(j => j.BoutID);

            var jamEstimateMap = CalculateJamDurationLimits(connection, transaction, jamMap);

            foreach (IGrouping <int, Jam> boutJamSet in boutJams)
            {
                ProcessBout(boutJamSet, penaltyGroupMap[boutJamSet.Key], jamEstimateMap);
            }
            var boxTimeEstimates = CalculateBoxTimeEstimates(jamEstimateMap);

            jtlGateway.InsertJamTimeEstimates(jamEstimateMap.Values, true);
            new BoxTimeEstimateGateway(connection, transaction).InsertBoxTimeEstimates(boxTimeEstimates, true);
            transaction.Commit();
            connection.Close();
        }
        private void CalculatePlayerEffectiveness()
        {
            if (_jamTeamEffectiveness == null)
            {
                CalculateJamTeamEffectiveness();
            }

            SqlConnection connection = new SqlConnection(_connectionString);

            connection.Open();
            SqlTransaction transaction = connection.BeginTransaction();

            _jamPlayers    = new JamPlayerGateway(connection, transaction).GetJamPlayers();
            _penaltyGroups = new PenaltyGroupGateway(connection, transaction).GetAllPenaltyGroups();

            // these three get mapped by jam
            var jteMap     = _jamTeamEffectiveness.GroupBy(jte => jte.JamID).ToDictionary(g => g.Key);
            var jamDataMap = _jamTeamData.GroupBy(jf => jf.JamID).ToDictionary(g => g.Key);
            var jpJamMap   = _jamPlayers.GroupBy(jp => jp.JamID).ToDictionary(g => g.Key);
            var jamTimeMap = new JamTimeLimitGateway(connection, transaction).GetAllJamTimeEstimates().ToDictionary(jte => jte.JamID);
            //var jpPlayerMap = players.GroupBy(jp => jp.PlayerID).ToDictionary(g => g.Key);

            // the best we can do with this is map it by player
            var pgMap = _penaltyGroups.GroupBy(pg => pg.PlayerID).ToDictionary(g => g.Key, g => g.ToList());

            Dictionary <int, List <JamPlayerEffectiveness> > pjeMap         = new Dictionary <int, List <JamPlayerEffectiveness> >();
            Dictionary <int, List <PenaltyGroup> >           jamBoxTimeMap1 = new Dictionary <int, List <PenaltyGroup> >();
            Dictionary <int, List <PenaltyGroup> >           jamBoxTimeMap2 = new Dictionary <int, List <PenaltyGroup> >();

            _boxTimeEstimates = new BoxTimeEstimateGateway(connection, transaction).GetAllBoxTimeEstimates();
            int maxJamID = jteMap.Keys.Max();
            int jamID    = 1;

            while (jamID <= maxJamID)
            {
                if (!jteMap.ContainsKey(jamID))
                {
                    jamID++;
                    continue;
                }
                var tempJte = jteMap[jamID].OrderBy(jte => jte.TeamID);
                JamTeamEffectiveness jte1             = tempJte.First();
                JamTeamEffectiveness jte2             = tempJte.Last();
                var team1Players                      = jpJamMap[jamID].Where(jp => jp.TeamID == jte1.TeamID);
                var team2Players                      = jpJamMap[jamID].Where(jp => jp.TeamID == jte2.TeamID);
                List <JamPlayerEffectiveness> pjeList = new List <JamPlayerEffectiveness>(5);
                int jamTime = jamTimeMap[jamID].Estimate;

                // handle each player
                foreach (JamPlayer player in team1Players)
                {
                    ProcessJamPlayer(pgMap, jamBoxTimeMap1, _boxTimeEstimates, jamID, jte1, pjeList, jamTime, player);
                }

                List <JamPlayerEffectiveness> pjeList2 = new List <JamPlayerEffectiveness>(5);
                // handle each player
                foreach (JamPlayer player in team2Players)
                {
                    ProcessJamPlayer(pgMap, jamBoxTimeMap2, _boxTimeEstimates, jamID, jte2, pjeList, jamTime, player);
                }

                pjeMap[jamID] = pjeList;
                pjeMap[jamID].AddRange(pjeList2);
                jamID++;
            }

            jamID = 1;
            while (jamID <= maxJamID)
            {
                if (!jteMap.ContainsKey(jamID))
                {
                    jamID++;
                    continue;
                }
                var tempJte = jteMap[jamID].OrderBy(jte => jte.TeamID);
                JamTeamEffectiveness jte1 = tempJte.First();
                JamTeamEffectiveness jte2 = tempJte.Last();
                // apply box time costs to players with correlated penalties
                if (jamBoxTimeMap1.ContainsKey(jamID))
                {
                    AssignPenaltyCosts(jamDataMap, jamTimeMap, pjeMap, jamBoxTimeMap1, _boxTimeEstimates, jamID, jte1);
                }
                // apply box time costs to players with correlated penalties
                if (jamBoxTimeMap2.ContainsKey(jamID))
                {
                    AssignPenaltyCosts(jamDataMap, jamTimeMap, pjeMap, jamBoxTimeMap2, _boxTimeEstimates, jamID, jte2);
                }
                jamID++;
            }
            new JamPlayerEffectivenessGateway(connection, transaction).InsertJamPlayerEffectiveness(pjeMap);
            transaction.Commit();
            connection.Close();
        }