/// <summary> /// Inserts the specified replacement value for the indicator parameter, /// if <see cref="CheckIfOverrideIsRequired"/>. /// Note: /// <see cref="ParameterReplacementDefinition.IndicatorParameterIdentifier"/> is removed from /// <paramref name="parameters"/>, if it is contained <c>and</c> the current value /// matches <see cref="ParameterReplacementDefinition.IndicatorParameterValue"/>. /// </summary> /// <param name="parameters"> /// The genome's <see cref="Genome.GetActiveGenes"/>. /// </param> /// <param name="parameterReplacementDefinition"> /// The parameter wrapper to handle. /// </param> private static void InsertNativeParameterForIndicator( Dictionary <string, IAllele> parameters, ParameterReplacementDefinition parameterReplacementDefinition) { IAllele dummyIndicatorParameter; if (!parameters.TryGetValue(parameterReplacementDefinition.IndicatorParameterIdentifier, out dummyIndicatorParameter)) { return; } var overrideOrSetNativeValue = CheckIfOverrideIsRequired(dummyIndicatorParameter, parameterReplacementDefinition); if (overrideOrSetNativeValue) { parameters[parameterReplacementDefinition.ControlledParameterIdentifier] = parameterReplacementDefinition.NativeOverrideValue; parameters.Remove(parameterReplacementDefinition.IndicatorParameterIdentifier); } }
/// <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); } }
/// <summary> /// Check if override of <see cref="ParameterReplacementDefinition.IndicatorParameterIdentifier"/> is required. /// </summary> /// <param name="indicatorInCurrentTree"> /// The indicator's value in the current tree. /// </param> /// <param name="replacementDefinitionWithOverride"> /// The wrapper with override. /// </param> /// <returns> /// True, if <paramref name="indicatorInCurrentTree"/>.GetValue().Equals(<see cref="ParameterReplacementDefinition.IndicatorParameterValue"/>). /// </returns> private static bool CheckIfOverrideIsRequired( IAllele indicatorInCurrentTree, ParameterReplacementDefinition replacementDefinitionWithOverride) { return(object.Equals(indicatorInCurrentTree.GetValue(), replacementDefinitionWithOverride.IndicatorParameterValue)); }