Ejemplo n.º 1
0
        public static Profile Mate(Profile parentA, Profile parentB, double minMix, double maxMix)
        {
            if (null == parentA)
            {
                throw new ArgumentNullException(nameof(parentA));
            }

            if (null == parentB)
            {
                throw new ArgumentNullException(nameof(parentB));
            }

            if (minMix > maxMix)
            {
                throw new ArgumentOutOfRangeException("minMix");
            }

            Guid id = Guid.NewGuid();

            string name = GenerateName(id);

            int generation = Math.Max(parentA.Generation, parentB.Generation) + 1;

            MetricWeights startMetricWeights = MixMetricWeights(parentA.StartMetricWeights.GetNormalized(), parentB.StartMetricWeights.GetNormalized(), minMix, maxMix);
            MetricWeights endMetricWeights   = MixMetricWeights(parentA.EndMetricWeights.GetNormalized(), parentB.EndMetricWeights.GetNormalized(), minMix, maxMix);

            DateTime creationTimestamp = DateTime.Now;

            return(new Profile(id, name, generation, parentA.Id, parentB.Id, startMetricWeights, endMetricWeights));
        }
Ejemplo n.º 2
0
        private Profile(Guid id, string name, int generation, Guid?parentA, Guid?parentB, int eloRating, int wins, int losses, int draws, MetricWeights startMetricWeights, MetricWeights endMetricWeights, DateTime creationTimestamp, DateTime lastUpdatedTimestamp)
        {
            if (generation < 0)
            {
                throw new ArgumentOutOfRangeException("generation");
            }

            if (eloRating < EloUtils.MinRating)
            {
                throw new ArgumentOutOfRangeException("eloRating");
            }

            if (wins < 0)
            {
                throw new ArgumentOutOfRangeException("wins");
            }

            if (losses < 0)
            {
                throw new ArgumentOutOfRangeException("losses");
            }

            if (draws < 0)
            {
                throw new ArgumentOutOfRangeException("draws");
            }

            if (null == startMetricWeights)
            {
                throw new ArgumentNullException("startMetricWeights");
            }

            if (null == endMetricWeights)
            {
                throw new ArgumentNullException("endMetricWeights");
            }

            Id   = id;
            Name = name;

            Generation = (!parentA.HasValue || !parentB.HasValue) ? 0 : generation;

            ParentA = parentA;
            ParentB = parentB;

            EloRating = eloRating;

            Wins   = wins;
            Losses = losses;
            Draws  = draws;

            StartMetricWeights = startMetricWeights;
            EndMetricWeights   = endMetricWeights;

            CreationTimestamp    = creationTimestamp;
            LastUpdatedTimestamp = lastUpdatedTimestamp;
        }
Ejemplo n.º 3
0
        public void UpdateMetricWeights(MetricWeights startMetricWeights, MetricWeights endMetricWeights, ExpansionPieces expansionPieces)
        {
            StartMetricWeights = startMetricWeights ?? throw new ArgumentNullException(nameof(startMetricWeights));
            EndMetricWeights   = endMetricWeights ?? throw new ArgumentNullException(nameof(endMetricWeights));

            Records[(int)expansionPieces].AutoTrains++;

            Update();
        }
Ejemplo n.º 4
0
        private void SetEndMetricWeights(ExpansionPieces expansionPieces, MetricWeights metricWeights)
        {
            if (!MetricWeightSet.ContainsKey(expansionPieces))
            {
                MetricWeightSet.Add(expansionPieces, new MetricWeights[2]);
            }

            MetricWeightSet[expansionPieces][1] = metricWeights;
        }
Ejemplo n.º 5
0
        public void MetricWeights_GetNormalizedTest()
        {
            MetricWeights mw = new MetricWeights();

            Assert.IsNotNull(mw);

            MetricWeights normalized = mw.GetNormalized();

            Assert.IsNotNull(mw);
        }
Ejemplo n.º 6
0
        public void LoadGameAIConfig(XmlReader reader)
        {
            if (null == reader)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    ExpansionPieces expansionPieces = EnumUtils.ParseExpansionPieces(reader["GameType"]);

                    switch (reader.Name)
                    {
                    case "TranspositionTableSizeMB":
                        ParseTranspositionTableSizeMBValue(reader.ReadElementContentAsString());
                        break;

                    case "MaxHelperThreads":
                        ParseMaxHelperThreadsValue(reader.ReadElementContentAsString());
                        break;

                    case "PonderDuringIdle":
                        ParsePonderDuringIdleValue(reader.ReadElementContentAsString());
                        break;

                    case "MaxBranchingFactor":
                        ParseMaxBranchingFactorValue(reader.ReadElementContentAsString());
                        break;

                    case "ReportIntermediateBestMoves":
                        ParseReportIntermediateBestMovesValue(reader.ReadElementContentAsString());
                        break;

                    case "MetricWeights":
                        SetStartMetricWeights(expansionPieces, MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree()));
                        SetEndMetricWeights(expansionPieces, MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree()));
                        break;

                    case "StartMetricWeights":
                        SetStartMetricWeights(expansionPieces, MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree()));
                        break;

                    case "EndMetricWeights":
                        SetEndMetricWeights(expansionPieces, MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree()));
                        break;

                    case "InitialTranspositionTable":
                        SetInitialTranspositionTable(expansionPieces, TranspositionTable.ReadTranspositionTableXml(reader.ReadSubtree()));
                        break;
                    }
                }
            }
        }
Ejemplo n.º 7
0
        public static Profile Generate(double minWeight, double maxWeight)
        {
            MetricWeights startMetricWeights = GenerateMetricWeights(minWeight, maxWeight);
            MetricWeights endMetricWeights   = GenerateMetricWeights(minWeight, maxWeight);

            Guid id = Guid.NewGuid();

            string name = GenerateName(id);

            return(new Profile(id, name, startMetricWeights, endMetricWeights));
        }
Ejemplo n.º 8
0
        private static MetricWeights GenerateMetricWeights(double minWeight, double maxWeight)
        {
            MetricWeights mw = new MetricWeights();

            MetricWeights.IterateOverWeights((bugType, bugTypeWeight) =>
            {
                double value = minWeight + (Random.NextDouble() * (maxWeight - minWeight));
                mw.Set(bugType, bugTypeWeight, value);
            });

            return(mw);
        }
Ejemplo n.º 9
0
        public Profile(Guid id, string name, MetricWeights startMetricWeights, MetricWeights endMetricWeights)
        {
            Id = id;

            Name = name;

            Records = ProfileRecord.CreateRecords();

            StartMetricWeights = startMetricWeights ?? throw new ArgumentNullException(nameof(startMetricWeights));
            EndMetricWeights   = endMetricWeights ?? throw new ArgumentNullException(nameof(endMetricWeights));

            CreationTimestamp    = DateTime.Now;
            LastUpdatedTimestamp = DateTime.Now;
        }
Ejemplo n.º 10
0
        private Profile(Guid id, string name, int generation, Guid?parentA, Guid?parentB, int eloRating, MetricWeights startMetricWeights, MetricWeights endMetricWeights)
        {
            if (generation < 0)
            {
                throw new ArgumentOutOfRangeException("generation");
            }

            if (!parentA.HasValue)
            {
                throw new ArgumentNullException("parentA");
            }

            if (!parentB.HasValue)
            {
                throw new ArgumentNullException("parentB");
            }

            if (eloRating < EloUtils.MinRating)
            {
                throw new ArgumentOutOfRangeException("eloRating");
            }

            if (null == startMetricWeights)
            {
                throw new ArgumentNullException("startMetricWeights");
            }

            if (null == endMetricWeights)
            {
                throw new ArgumentNullException("endMetricWeights");
            }

            Id = id;

            Name = name;

            Generation = generation;

            ParentA = parentA;
            ParentB = parentB;

            EloRating = eloRating;

            StartMetricWeights = startMetricWeights;
            EndMetricWeights   = endMetricWeights;

            CreationTimestamp    = DateTime.Now;
            LastUpdatedTimestamp = DateTime.Now;
        }
Ejemplo n.º 11
0
        public MetricWeights[] GetMetricWeights(ExpansionPieces expansionPieces)
        {
            MetricWeights[] result;

            // Start with the weights for the base game type
            if (!MetricWeightSet.TryGetValue(ExpansionPieces.None, out result))
            {
                // No base game type, start with nulls
                result = new MetricWeights[2];
            }

            if (expansionPieces != ExpansionPieces.None)
            {
                // Try to get weights specific to this game type
                if (MetricWeightSet.TryGetValue(expansionPieces, out MetricWeights[] mw))
Ejemplo n.º 12
0
        public void Analyze(string path)
        {
            StartTime = DateTime.Now;
            Log("Analyze start.");

            List <Profile> profiles = LoadProfiles(path);

            profiles = new List <Profile>(profiles.OrderByDescending(profile => profile.EloRating));

            string resultFile = Path.Combine(path, "analyze.csv");

            using (StreamWriter sw = new StreamWriter(resultFile))
            {
                // Header
                StringBuilder headerSB = new StringBuilder();

                headerSB.Append("Id,Name,EloRating,Generation,ParentA,ParentB,Wins,Losses,Draws");

                MetricWeights.IterateOverWeights((bugType, bugTypeWeight) =>
                {
                    headerSB.AppendFormat(",Start{0}.{1}", bugType, bugTypeWeight);
                    headerSB.AppendFormat(",End{0}.{1}", bugType, bugTypeWeight);
                });

                sw.WriteLine(headerSB.ToString());

                foreach (Profile p in profiles)
                {
                    StringBuilder profileSB = new StringBuilder();

                    profileSB.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8}", p.Id, p.Name, p.EloRating, p.Generation, p.ParentA.HasValue ? p.ParentA.ToString() : "", p.ParentB.HasValue ? p.ParentB.ToString() : "", p.Wins, p.Losses, p.Draws);

                    MetricWeights startNormalized = p.StartMetricWeights.GetNormalized();
                    MetricWeights endNormalized   = p.EndMetricWeights.GetNormalized();

                    MetricWeights.IterateOverWeights((bugType, bugTypeWeight) =>
                    {
                        profileSB.AppendFormat(",{0:0.00}", startNormalized.Get(bugType, bugTypeWeight));
                        profileSB.AppendFormat(",{0:0.00}", endNormalized.Get(bugType, bugTypeWeight));
                    });

                    sw.WriteLine(profileSB.ToString());
                }
            }

            Log("Analyze end.");
        }
Ejemplo n.º 13
0
        private static MetricWeights MixMetricWeights(MetricWeights mwA, MetricWeights mwB, double minMix, double maxMix)
        {
            MetricWeights mw = new MetricWeights();

            MetricWeights.IterateOverWeights((bugType, bugTypeWeight) =>
            {
                double value = 0.5 * (mwA.Get(bugType, bugTypeWeight) + mwB.Get(bugType, bugTypeWeight));
                if (value == 0.0)
                {
                    value = -0.01 + (Random.NextDouble() * 0.02);
                }
                value = value * (minMix + (Random.NextDouble() * Math.Abs(maxMix - minMix)));
                mw.Set(bugType, bugTypeWeight, value);
            });

            return(mw);
        }
Ejemplo n.º 14
0
        public void UpdateMetricWeights(MetricWeights startMetricWeights, MetricWeights endMetricWeights)
        {
            if (null == startMetricWeights)
            {
                throw new ArgumentNullException("startMetricWeights");
            }

            if (null == endMetricWeights)
            {
                throw new ArgumentNullException("endMetricWeights");
            }

            StartMetricWeights = startMetricWeights;
            EndMetricWeights   = endMetricWeights;

            Update();
        }
Ejemplo n.º 15
0
        private void LoadGameAIConfig(XmlReader reader)
        {
            if (null == reader)
            {
                throw new ArgumentNullException("reader");
            }

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    switch (reader.Name)
                    {
                    case "TranspositionTableSizeMB":
                        ParseTranspositionTableSizeMBValue(reader.ReadElementContentAsString());
                        break;

                    case "MetricWeights":
                    case "StartMetricWeights":
                        StartMetricWeights = MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree());
                        break;

                    case "EndMetricWeights":
                        EndMetricWeights = MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree());
                        break;

                    case "MaxHelperThreads":
                        ParseMaxHelperThreadsValue(reader.ReadElementContentAsString());
                        break;

                    case "PonderDuringIdle":
                        ParsePonderDuringIdleValue(reader.ReadElementContentAsString());
                        break;

                    case "MaxBranchingFactor":
                        ParseMaxBranchingFactorValue(reader.ReadElementContentAsString());
                        break;

                    case "ReportIntermediateBestMoves":
                        ParseReportIntermediateBestMovesValue(reader.ReadElementContentAsString());
                        break;
                    }
                }
            }
        }
Ejemplo n.º 16
0
        private Profile(Guid id, string name, MetricWeights startMetricWeights, MetricWeights endMetricWeights)
        {
            if (null == startMetricWeights)
            {
                throw new ArgumentNullException("startMetricWeights");
            }

            if (null == endMetricWeights)
            {
                throw new ArgumentNullException("endMetricWeights");
            }

            Id = id;

            Name = name;

            StartMetricWeights = startMetricWeights;
            EndMetricWeights   = endMetricWeights;

            CreationTimestamp    = DateTime.Now;
            LastUpdatedTimestamp = DateTime.Now;
        }
Ejemplo n.º 17
0
        public void MetricWeights_NewTest()
        {
            MetricWeights mw = new MetricWeights();

            Assert.IsNotNull(mw);
        }
Ejemplo n.º 18
0
        public static Profile ReadXml(Stream inputStream)
        {
            if (null == inputStream)
            {
                throw new ArgumentNullException(nameof(inputStream));
            }

            Guid   id         = Guid.Empty;
            string name       = null;
            int    generation = 0;

            Guid?parentA = null;
            Guid?parentB = null;

            ProfileRecord[] records = ProfileRecord.CreateRecords();

            MetricWeights startMetricWeights = null;
            MetricWeights endMetricWeights   = null;

            DateTime creationTimestamp   = DateTime.Now;
            DateTime lastUpdateTimestamp = creationTimestamp;

            using (XmlReader reader = XmlReader.Create(inputStream))
            {
                while (reader.Read())
                {
                    if (reader.IsStartElement())
                    {
                        switch (reader.Name)
                        {
                        case "Id":
                            id = Guid.Parse(reader.ReadElementContentAsString());
                            break;

                        case "Name":
                            name = reader.ReadElementContentAsString();
                            break;

                        case "Generation":
                            generation = reader.ReadElementContentAsInt();
                            break;

                        case "ParentA":
                            parentA = Guid.Parse(reader.ReadElementContentAsString());
                            break;

                        case "ParentB":
                            parentB = Guid.Parse(reader.ReadElementContentAsString());
                            break;

                        case "Record":
                        {
                            if (EnumUtils.TryParseExpansionPieces(reader["GameType"], out ExpansionPieces ep))
                            {
                                int.TryParse(reader["EloRating"], out records[(int)ep].EloRating);
                                int.TryParse(reader["Wins"], out records[(int)ep].Wins);
                                int.TryParse(reader["Losses"], out records[(int)ep].Losses);
                                int.TryParse(reader["Draws"], out records[(int)ep].Draws);
                                int.TryParse(reader["AutoTrains"], out records[(int)ep].AutoTrains);
                            }
                        }
                        break;

                        case "Creation":
                            creationTimestamp = reader.ReadElementContentAsDateTime();
                            break;

                        case "LastUpdated":
                            lastUpdateTimestamp = reader.ReadElementContentAsDateTime();
                            break;

                        case "MetricWeights":
                        case "StartMetricWeights":
                            startMetricWeights = MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree());
                            break;

                        case "EndMetricWeights":
                            endMetricWeights = MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree());
                            break;
                        }
                    }
                }
            }

            return(new Profile(id, name ?? GenerateName(id), generation, parentA, parentB, records, startMetricWeights, endMetricWeights ?? startMetricWeights, creationTimestamp, lastUpdateTimestamp));
        }
Ejemplo n.º 19
0
        private Profile(Guid id, string name, int generation, Guid?parentA, Guid?parentB, ProfileRecord[] records, MetricWeights startMetricWeights, MetricWeights endMetricWeights, DateTime creationTimestamp, DateTime lastUpdatedTimestamp)
        {
            if (generation < 0)
            {
                throw new ArgumentOutOfRangeException("generation");
            }

            Id   = id;
            Name = name;

            Generation = (!parentA.HasValue || !parentB.HasValue) ? 0 : generation;

            ParentA = parentA;
            ParentB = parentB;

            Records = records;

            StartMetricWeights = startMetricWeights ?? throw new ArgumentNullException(nameof(startMetricWeights));
            EndMetricWeights   = endMetricWeights ?? throw new ArgumentNullException(nameof(endMetricWeights));

            CreationTimestamp    = creationTimestamp;
            LastUpdatedTimestamp = lastUpdatedTimestamp;
        }
Ejemplo n.º 20
0
        private Profile(Guid id, string name, int generation, Guid?parentA, Guid?parentB, MetricWeights startMetricWeights, MetricWeights endMetricWeights)
        {
            if (generation < 0)
            {
                throw new ArgumentOutOfRangeException("generation");
            }

            if (!parentA.HasValue)
            {
                throw new ArgumentNullException(nameof(parentA));
            }

            if (!parentB.HasValue)
            {
                throw new ArgumentNullException(nameof(parentB));
            }

            Id = id;

            Name = name;

            Generation = generation;

            ParentA = parentA;
            ParentB = parentB;

            Records = ProfileRecord.CreateRecords();

            StartMetricWeights = startMetricWeights ?? throw new ArgumentNullException(nameof(startMetricWeights));
            EndMetricWeights   = endMetricWeights ?? throw new ArgumentNullException(nameof(endMetricWeights));

            CreationTimestamp    = DateTime.Now;
            LastUpdatedTimestamp = DateTime.Now;
        }
Ejemplo n.º 21
0
        public void WriteXml(Stream outputStream)
        {
            if (null == outputStream)
            {
                throw new ArgumentNullException("outputStream");
            }

            XmlWriterSettings settings = new XmlWriterSettings
            {
                Indent = true
            };

            using (XmlWriter writer = XmlWriter.Create(outputStream, settings))
            {
                writer.WriteStartElement("Profile");

                writer.WriteStartElement("Id");
                writer.WriteValue(Id.ToString());
                writer.WriteEndElement();

                if (!string.IsNullOrWhiteSpace(_name))
                {
                    writer.WriteStartElement("Name");
                    writer.WriteValue(_name.Trim());
                    writer.WriteEndElement();
                }

                writer.WriteStartElement("Generation");
                writer.WriteValue(Generation);
                writer.WriteEndElement();

                if (ParentA.HasValue)
                {
                    writer.WriteStartElement("ParentA");
                    writer.WriteValue(ParentA.ToString());
                    writer.WriteEndElement();
                }

                if (ParentB.HasValue)
                {
                    writer.WriteStartElement("ParentB");
                    writer.WriteValue(ParentB.ToString());
                    writer.WriteEndElement();
                }


                writer.WriteStartElement("EloRating");
                writer.WriteValue(EloRating);
                writer.WriteEndElement();

                writer.WriteStartElement("Wins");
                writer.WriteValue(Wins);
                writer.WriteEndElement();

                writer.WriteStartElement("Losses");
                writer.WriteValue(Losses);
                writer.WriteEndElement();

                writer.WriteStartElement("Draws");
                writer.WriteValue(Draws);
                writer.WriteEndElement();

                writer.WriteStartElement("Creation");
                writer.WriteValue(CreationTimestamp);
                writer.WriteEndElement();

                writer.WriteStartElement("LastUpdated");
                writer.WriteValue(LastUpdatedTimestamp);
                writer.WriteEndElement();

                writer.WriteStartElement("StartMetricWeights");

                MetricWeights.IterateOverWeights((bugType, bugTypeWeight) =>
                {
                    string key   = MetricWeights.GetKeyName(bugType, bugTypeWeight);
                    double value = StartMetricWeights.Get(bugType, bugTypeWeight);

                    writer.WriteStartElement(key);
                    writer.WriteValue(value);
                    writer.WriteEndElement();
                });

                writer.WriteEndElement(); // </StartMetricWeights>

                writer.WriteStartElement("EndMetricWeights");

                MetricWeights.IterateOverWeights((bugType, bugTypeWeight) =>
                {
                    string key   = MetricWeights.GetKeyName(bugType, bugTypeWeight);
                    double value = EndMetricWeights.Get(bugType, bugTypeWeight);

                    writer.WriteStartElement(key);
                    writer.WriteValue(value);
                    writer.WriteEndElement();
                });

                writer.WriteEndElement(); // </EndMetricWeights>

                writer.WriteEndElement(); // </Profile>
            }
        }
Ejemplo n.º 22
0
        public static Profile ReadXml(Stream inputStream)
        {
            if (null == inputStream)
            {
                throw new ArgumentNullException("inputStream");
            }

            Guid   id         = Guid.Empty;
            string name       = null;
            int    generation = 0;

            Guid?parentA = null;
            Guid?parentB = null;

            int eloRating = EloUtils.DefaultRating;

            int wins   = 0;
            int losses = 0;
            int draws  = 0;

            MetricWeights startMetricWeights = null;
            MetricWeights endMetricWeights   = null;

            DateTime creationTimestamp   = DateTime.Now;
            DateTime lastUpdateTimestamp = creationTimestamp;

            using (XmlReader reader = XmlReader.Create(inputStream))
            {
                while (reader.Read())
                {
                    if (reader.IsStartElement())
                    {
                        switch (reader.Name)
                        {
                        case "Id":
                            id = Guid.Parse(reader.ReadElementContentAsString());
                            break;

                        case "Name":
                            name = reader.ReadElementContentAsString();
                            break;

                        case "Generation":
                            generation = reader.ReadElementContentAsInt();
                            break;

                        case "ParentA":
                            parentA = Guid.Parse(reader.ReadElementContentAsString());
                            break;

                        case "ParentB":
                            parentB = Guid.Parse(reader.ReadElementContentAsString());
                            break;

                        case "EloRating":
                            eloRating = reader.ReadElementContentAsInt();
                            break;

                        case "Wins":
                            wins = reader.ReadElementContentAsInt();
                            break;

                        case "Losses":
                            losses = reader.ReadElementContentAsInt();
                            break;

                        case "Draws":
                            draws = reader.ReadElementContentAsInt();
                            break;

                        case "Creation":
                            creationTimestamp = reader.ReadElementContentAsDateTime();
                            break;

                        case "LastUpdated":
                            lastUpdateTimestamp = reader.ReadElementContentAsDateTime();
                            break;

                        case "MetricWeights":
                        case "StartMetricWeights":
                            startMetricWeights = MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree());
                            break;

                        case "EndMetricWeights":
                            endMetricWeights = MetricWeights.ReadMetricWeightsXml(reader.ReadSubtree());
                            break;
                        }
                    }
                }
            }

            return(new Profile(id, name ?? GenerateName(id), generation, parentA, parentB, eloRating, wins, losses, draws, startMetricWeights, endMetricWeights ?? startMetricWeights, creationTimestamp, lastUpdateTimestamp));
        }