/// <summary> /// Generates a complete configuration for the simple item generator. /// </summary> /// <param name="preConfig">The pre-configuration defining characteristics of the actual configuration.</param> /// <returns>The complete configuration.</returns> public static SimpleItemGeneratorConfiguration GenerateSimpleItemConfiguration(SimpleItemGeneratorPreConfiguration preConfig) { // Init SimpleItemGeneratorConfiguration config = new SimpleItemGeneratorConfiguration() { DefaultWeight = preConfig.DefaultWeight, DefaultCoWeight = preConfig.DefaultCoWeight, ProbToUseCoWeight = preConfig.ProbToUseCoWeight }; RandomizerSimple randomizer = new RandomizerSimple(0); List <SimpleItemDescription> itemDescriptions = new List <SimpleItemDescription>(); List <Tuple <SimpleItemDescription, double> > itemDescriptionWeights = new List <Tuple <SimpleItemDescription, double> >(); List <Tuple <SimpleItemDescription, SimpleItemDescription, double> > itemDescriptionCoWeights = new List <Tuple <SimpleItemDescription, SimpleItemDescription, double> >(); // Add comment config.Description = string.Join(",", typeof(SimpleItemGeneratorPreConfiguration).GetFields().Select(f => { string fieldValue; if (f.GetValue(preConfig) is double) { fieldValue = ((double)f.GetValue(preConfig)).ToString(IOConstants.FORMATTER); } else { fieldValue = f.GetValue(preConfig).ToString(); } return(f.Name + "=" + fieldValue); })); // Generate a set of item-descriptions for (int i = 0; i < preConfig.ItemDescriptionCount; i++) { // Generate next item SimpleItemDescription description = new SimpleItemDescription(null) { ID = i }; // Randomly weight the item double itemDescriptionWeight = 0; switch (preConfig.WeightDistributionType) { case ItemDescriptionWeightDistributionType.Normal: itemDescriptionWeight = randomizer.NextNormalDouble(preConfig.ItemWeightMu, preConfig.ItemWeightSigma, preConfig.ItemWeightLB, preConfig.ItemWeightUB); break; case ItemDescriptionWeightDistributionType.Uniform: itemDescriptionWeight = randomizer.NextDouble(preConfig.ItemWeightLB, preConfig.ItemWeightUB); break; default: throw new ArgumentException("Unknown distribution: " + preConfig.WeightDistributionType); } description.Weight = itemDescriptionWeight; // Randomly determine bundle size of the item if (preConfig.SupplyBundleSize) { int itemDescriptionBundleSize = 0; switch (preConfig.BundleSizeDistributionType) { case ItemDescriptionBundleSizeDistributionType.Normal: itemDescriptionBundleSize = randomizer.NextNormalInt(preConfig.BundleSizeMu, preConfig.BundleSizeSigma, preConfig.BundleSizeLB, preConfig.BundleSizeUB); break; case ItemDescriptionBundleSizeDistributionType.Uniform: itemDescriptionBundleSize = randomizer.NextInt(preConfig.BundleSizeLB, preConfig.BundleSizeUB + 1); break; default: throw new ArgumentException("Unknown distribution: " + preConfig.BundleSizeDistributionType); } description.BundleSize = itemDescriptionBundleSize; } // Add a random hue value to distinguish the item from others description.Hue = randomizer.NextDouble(360); // Add it itemDescriptions.Add(description); // Set a weight for the probability of the item double weight = 0; switch (preConfig.ProbWeightDistributionType) { case ItemDescriptionProbabilityWeightDistributionType.Constant: weight = preConfig.ProbabilityWeightConstant; break; case ItemDescriptionProbabilityWeightDistributionType.Uniform: weight = randomizer.NextDouble(preConfig.ProbabilityWeightUniformMin, preConfig.ProbabilityWeightUniformMax); break; case ItemDescriptionProbabilityWeightDistributionType.Normal: weight = randomizer.NextNormalDouble(preConfig.ProbabilityWeightNormalMu, preConfig.ProbabilityWeightNormalSigma, preConfig.ProbabilityWeightLB, preConfig.ProbabilityWeightUB); break; case ItemDescriptionProbabilityWeightDistributionType.Exponential: weight = randomizer.NextExponentialDouble(preConfig.ProbabilityWeightExpLambda, preConfig.ProbabilityWeightLB, preConfig.ProbabilityWeightUB); break; case ItemDescriptionProbabilityWeightDistributionType.Gamma: weight = randomizer.NextGammaDouble(preConfig.ProbabilityWeightGammaK, preConfig.ProbabilityWeightGammaTheta, preConfig.ProbabilityWeightLB, preConfig.ProbabilityWeightUB); break; default: throw new ArgumentException("Unknown distribution: " + preConfig.ProbWeightDistributionType); } itemDescriptionWeights.Add(new Tuple <SimpleItemDescription, double>(description, weight)); } // Equally distribute items over two-dimensional space Dictionary <SimpleItemDescription, Tuple <double, double> > itemDescriptionPosition = new Dictionary <SimpleItemDescription, Tuple <double, double> >(); foreach (var description in itemDescriptions) { itemDescriptionPosition[description] = new Tuple <double, double>(randomizer.NextDouble(), randomizer.NextDouble()); } // Plot the distribution for reference GnuPlotter.Plot2DPoints( "itemdistribution", new List <Tuple <string, IEnumerable <Tuple <double, double> > > >() { new Tuple <string, IEnumerable <Tuple <double, double> > >("Item locations in 2D", itemDescriptionPosition.Values) }, "item distribution for co-probability emulation"); // Set conditional weights double maxDistance = Distances.CalculateEuclid(0, 0, 1, 1); foreach (var description in itemDescriptions.OrderBy(d => randomizer.NextDouble()).Take((int)(itemDescriptions.Count * preConfig.GivenCoWeights))) { foreach (var otherDescription in itemDescriptions.OrderBy(d => randomizer.NextDouble()).Take((int)(itemDescriptions.Count * preConfig.GivenCoWeights))) { itemDescriptionCoWeights.Add(new Tuple <SimpleItemDescription, SimpleItemDescription, double>( description, otherDescription, maxDistance - Distances.CalculateEuclid( itemDescriptionPosition[description].Item1, itemDescriptionPosition[description].Item2, itemDescriptionPosition[otherDescription].Item1, itemDescriptionPosition[otherDescription].Item2))); } } // Submit all config.ItemDescriptions = itemDescriptions.Select(d => new Skvp <int, double>() { Key = d.ID, Value = d.Hue }).ToList(); config.ItemDescriptionWeights = itemDescriptions.Select(d => new Skvp <int, double>() { Key = d.ID, Value = d.Weight }).ToList(); if (preConfig.SupplyBundleSize) { config.ItemDescriptionBundleSizes = itemDescriptions.Select(d => new Skvp <int, int>() { Key = d.ID, Value = d.BundleSize }).ToList(); } config.ItemWeights = itemDescriptionWeights.Select(d => new Skvp <int, double>() { Key = d.Item1.ID, Value = d.Item2 }).ToList(); config.ItemCoWeights = itemDescriptionCoWeights.Select(d => new Skkvt <int, int, double>() { Key1 = d.Item1.ID, Key2 = d.Item2.ID, Value = d.Item3 }).ToList(); // Name it config.Name = config.GetMetaInfoBasedName(); // Return it return(config); }
/// <summary> /// Writes a simple item generator configuration to a file. /// </summary> /// <param name="path">The file.</param> /// <param name="config">The configuration.</param> public static void WriteSimpleItemGeneratorConfigFile(string path, SimpleItemGeneratorConfiguration config) { // Serialize the object to xml and write it to the given path using (StreamWriter sw = new StreamWriter(path)) _simpleItemGeneratorConfigSerializer.Serialize(sw, config); }