/// <summary> /// Validates the population metadata properties. /// </summary> /// <param name="populationMetadata">The population metadata to validate.</param> private static void ValidatePopulationProperties(IPopulationMetadata populationMetadata) { if (populationMetadata.SurvivalRate < 0 || populationMetadata.SurvivalRate > 1) { throw new ArgumentException("Error! Survival rate must be a value between 0 and 1."); } if (populationMetadata.DistanceThreshold < 0) { throw new ArgumentException("Error! Distance threshold must be a positive value."); } }
/// <summary> /// Performs semantic validation on the given <see cref="IPopulationMetadata"/>. /// </summary> /// <param name="populationMetadata">The given <see cref="IPopulationMetadata"/>.</param> internal static void Validate(IPopulationMetadata populationMetadata) { var seen = InitializeSeenTracker(populationMetadata); ValidatePopulationProperties(populationMetadata); foreach (var chromosomeMetadata in populationMetadata) { seen(chromosomeMetadata.Name); ValidateChromosomeProperties(chromosomeMetadata); } }
/// <summary> /// Constructs a new instance of the <see cref="Population"/> class. /// </summary> /// <param name="populationMetadata">The population metadata.</param> internal Population(IPopulationMetadata populationMetadata) { _populationMetadata = populationMetadata; if (_populationMetadata.CooperativeCoevolution) { _species = new Species[_populationMetadata.Count()]; for (var i = 0; i < _populationMetadata.Count(); i++) { _species[i] = new Species(this, _populationMetadata[i].Name); } } else { _species = new Species[1]; _species[0] = new Species(this); } _optimalSpecies = _species[0]; }
/// <summary> /// Initializes the seen tracker. /// </summary> /// <param name="populationMetadata">The population metadata to initialize against.</param> /// <returns>The seen tracker.</returns> private static Action <string> InitializeSeenTracker(IPopulationMetadata populationMetadata) { var seen = new Dictionary <string, bool>(); foreach (var chromosomeMetadata in populationMetadata) { seen[chromosomeMetadata.Name] = false; } return(name => { if (seen[name]) { throw new ArgumentException("Error! Every chromosome must have a unique name."); } else { seen[name] = true; } }); }
/// <summary> /// Creates a population object. /// </summary> /// <param name="metadata">The population metadata.</param> /// <returns>The constructed population.</returns> public IPopulation CreatePopulation(IPopulationMetadata metadata) { SemanticValidator.Validate(metadata); return(new Population(metadata) as IPopulation); }