/// <summary>
 /// Notify the strategy of a change in complexity regulation mode in the evolution algorithm.
 /// </summary>
 /// <param name="mode">The current mode.</param>
 public void NotifyComplexityRegulationMode(ComplexityRegulationMode mode)
 {
     _mutationTypeDistributionsCurrent = mode switch
     {
         ComplexityRegulationMode.Complexifying => _mutationTypeDistributionsComplexifying,
         ComplexityRegulationMode.Simplifying => _mutationTypeDistributionsSimplifying,
         _ => throw new ArgumentException("Unexpected complexity regulation mode."),
     };
 }
    /// <summary>
    /// Construct a new instance.
    /// </summary>
    /// <param name="metaNeatGenome">NeatGenome metadata.</param>
    /// <param name="genomeBuilder">NeatGenome builder.</param>
    /// <param name="genomeIdSeq">Genome ID sequence; for obtaining new genome IDs.</param>
    /// <param name="innovationIdSeq">Innovation ID sequence; for obtaining new innovation IDs.</param>
    /// <param name="generationSeq">Generation sequence; for obtaining the current generation number.</param>
    /// <param name="addedNodeBuffer">A history buffer of added nodes.</param>
    /// <param name="settings">Asexual reproduction settings.</param>
    /// <param name="weightMutationScheme">Connection weight mutation scheme.</param>
    public NeatReproductionAsexual(
        MetaNeatGenome <T> metaNeatGenome,
        INeatGenomeBuilder <T> genomeBuilder,
        Int32Sequence genomeIdSeq,
        Int32Sequence innovationIdSeq,
        Int32Sequence generationSeq,
        AddedNodeBuffer addedNodeBuffer,
        NeatReproductionAsexualSettings settings,
        WeightMutationScheme <T> weightMutationScheme)
    {
        var settingsComplexifying = settings;
        var settingsSimplifying   = settings.CreateSimplifyingSettings();

        _mutationTypeDistributionsComplexifying = new MutationTypeDistributions(settingsComplexifying);
        _mutationTypeDistributionsSimplifying   = new MutationTypeDistributions(settingsSimplifying);
        _mutationTypeDistributionsCurrent       = _mutationTypeDistributionsComplexifying;

        // Instantiate reproduction strategies.
        _mutateWeightsStrategy    = new MutateWeightsStrategy <T>(genomeBuilder, genomeIdSeq, generationSeq, weightMutationScheme);
        _deleteConnectionStrategy = new DeleteConnectionStrategy <T>(genomeBuilder, genomeIdSeq, generationSeq);

        // Add connection mutation; select acyclic/cyclic strategy as appropriate.
        if (metaNeatGenome.IsAcyclic)
        {
            _addConnectionStrategy = new AddAcyclicConnectionStrategy <T>(
                metaNeatGenome, genomeBuilder,
                genomeIdSeq, generationSeq);
        }
        else
        {
            _addConnectionStrategy = new AddCyclicConnectionStrategy <T>(
                metaNeatGenome, genomeBuilder,
                genomeIdSeq, generationSeq);
        }

        _addNodeStrategy = new AddNodeStrategy <T>(metaNeatGenome, genomeBuilder, genomeIdSeq, innovationIdSeq, generationSeq, addedNodeBuffer);
    }