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)); }
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; }
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(); }
private void SetEndMetricWeights(ExpansionPieces expansionPieces, MetricWeights metricWeights) { if (!MetricWeightSet.ContainsKey(expansionPieces)) { MetricWeightSet.Add(expansionPieces, new MetricWeights[2]); } MetricWeightSet[expansionPieces][1] = metricWeights; }
public void MetricWeights_GetNormalizedTest() { MetricWeights mw = new MetricWeights(); Assert.IsNotNull(mw); MetricWeights normalized = mw.GetNormalized(); Assert.IsNotNull(mw); }
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; } } } }
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)); }
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); }
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; }
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; }
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))
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."); }
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); }
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(); }
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; } } } }
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; }
public void MetricWeights_NewTest() { MetricWeights mw = new MetricWeights(); Assert.IsNotNull(mw); }
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)); }
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; }
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; }
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> } }
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)); }