/// <summary> /// Defines a new replacement for an artifical parameter. /// </summary> /// <param name="indicatorParameterIdentifier"> /// The identifier of the indicator (=dummy) parameter that needs to be replaced. /// This parameter will always be removed from the genomes set of active parameters. /// </param> /// <param name="indicatorParameterValue"> /// If the <paramref name="indicatorParameterIdentifier"/> is set to <paramref name="indicatorParameterValue"/> /// in the current genome, the <paramref name="controlledParameterIdentifier"/>/<paramref name="nativeOverrideValue"/> /// will be inserted in the set of the <see cref="Genome.GetActiveGenes"/>. /// </param> /// <param name="controlledParameterIdentifier"> /// The identifier of the parameter that will be inserted for <paramref name="indicatorParameterIdentifier"/> /// when it has the value <paramref name="indicatorParameterValue"/>. /// </param> /// <param name="nativeOverrideValue"> /// The value to insert for <paramref name="controlledParameterIdentifier"/>. /// </param> /// <typeparam name="T"> /// The value type of the inserted <see cref="Allele{T}"/>. /// </typeparam> /// <returns> /// The added <see cref="ParameterReplacementDefinition"/>. /// </returns> public ParameterReplacementDefinition DefineParameterReplacement <T>( string indicatorParameterIdentifier, object indicatorParameterValue, string controlledParameterIdentifier, T nativeOverrideValue) { lock (this._filterLock) { if (this.IsIndicatorParameterAndValueCombinationDefined(indicatorParameterIdentifier, indicatorParameterValue)) { throw new InvalidOperationException( $"You cannot add more than one active ParameterReplacementDefinition for a given combination of {nameof(indicatorParameterIdentifier)}/{nameof(indicatorParameterValue)}.\r\nA replacement for <{indicatorParameterIdentifier}, {indicatorParameterValue}> is already defined."); } var wrapper = new ParameterReplacementDefinition( indicatorParameterIdentifier, indicatorParameterValue, controlledParameterIdentifier); wrapper.SetNativeOverrideValue(nativeOverrideValue); this.ActiveParameterReplacements.Add(wrapper); return(wrapper); } }