Example #1
0
        public void ExtractActiveParametersThrowsForParametersNull()
        {
            var specification = new ParameterConfigurationSpaceSpecification(
                new List <IParameterNode> {
                new ValueNode <double>("a", new ContinuousDomain())
            },
                new Dictionary <string, List <EqualsCondition> >(),
                new List <ForbiddenParameterCombination>());

            Assert.Throws <ArgumentNullException>(() => specification.ExtractActiveParameters(parameters: null));
        }
Example #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ParameterConfigurationSpaceGenomeBuilderTest"/> class.
        /// </summary>
        public ParameterConfigurationSpaceGenomeBuilderTest()
        {
            this._parameterSpecification = ParameterConfigurationSpaceGenomeBuilderTest.CreateParameterConfigurationSpaceSpecification();
            this._parameterTree          = AcLibUtils.CreateParameterTree(this._parameterSpecification);
            this._genomeBuilder          = new ParameterConfigurationSpaceGenomeBuilder(
                this._parameterTree,
                this._parameterSpecification,
                this._configuration);

            Randomizer.Reset();
            Randomizer.Configure();
        }
Example #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ParameterConfigurationSpaceGenomeBuilder"/> class.
 /// </summary>
 /// <param name="parameterTree">The parameters' structure.</param>
 /// <param name="parameterSpecification">
 /// A specification defining forbidden parameter combinations and activity conditions.
 /// </param>
 /// <param name="configuration">Configuration parameters.</param>
 public ParameterConfigurationSpaceGenomeBuilder(
     ParameterTree parameterTree,
     ParameterConfigurationSpaceSpecification parameterSpecification,
     AlgorithmTunerConfiguration configuration)
     : base(parameterTree, configuration)
 {
     this._parameterTree          = parameterTree;
     this._parameterSpecification = parameterSpecification ??
                                    throw new ArgumentNullException(nameof(parameterSpecification));
     this._identifierToTreeNode =
         this._parameterTree.GetParameters().ToDictionary(node => node.Identifier, node => node);
 }
Example #4
0
        public void MakeGenomeValidOnlyChangesRelevantParameters()
        {
            // Create a specification with several parameters.
            var parameters = new List <IParameterNode>
            {
                new ValueNode <int>("a", new IntegerDomain(-2, 4)),
                new ValueNode <int>("Forbidden", new IntegerDomain(-30, 60)),
                new ValueNode <int>("c", new IntegerDomain(-2, 4)),
            };
            var forbiddenValue = new Dictionary <string, IAllele> {
                { "Forbidden", new Allele <int>(0) }
            };
            var inactiveForbiddenValue = new Dictionary <string, IAllele> {
                { "a", new Allele <int>(2) }
            };
            var forbiddenCombinations = new List <ForbiddenParameterCombination>
            {
                new ForbiddenParameterCombination(inactiveForbiddenValue),
                new ForbiddenParameterCombination(forbiddenValue),
            };
            var multipleParameterSpecification = new ParameterConfigurationSpaceSpecification(
                parameters,
                new Dictionary <string, List <EqualsCondition> >(),
                forbiddenCombinations);

            this._genomeBuilder = new ParameterConfigurationSpaceGenomeBuilder(
                AcLibUtils.CreateParameterTree(multipleParameterSpecification),
                multipleParameterSpecification,
                this._configuration);

            // Several times:
            int numberTests = 20;

            for (int i = 0; i < numberTests; i++)
            {
                // Create an invalid genome.
                var genome = new Genome();
                genome.SetGene("a", new Allele <int>(-1));
                genome.SetGene("Forbidden", new Allele <int>(0));
                genome.SetGene("c", new Allele <int>(2));

                // Repair it.
                this._genomeBuilder.MakeGenomeValid(genome);

                // Check it is repaired with only the forbidden value changed.
                Assert.NotEqual(
                    0,
                    genome.GetGeneValue("Forbidden").GetValue());
                Assert.Equal(-1, genome.GetGeneValue("a").GetValue());
                Assert.Equal(2, genome.GetGeneValue("c").GetValue());
            }
        }
Example #5
0
        public void ExtractActiveParametersRemovesInactiveParameters()
        {
            var parameters = new List <IParameterNode>
            {
                new ValueNode <int>("unconditional", new IntegerDomain()),
                new ValueNode <double>("unconditional_2", new ContinuousDomain()),
                new ValueNode <int>("conditions_met", new IntegerDomain()),
                new ValueNode <int>("one_condition_met", new IntegerDomain()),
            };
            var conditionsMet = new List <EqualsCondition>
            {
                new EqualsCondition("unconditional", new IAllele[] { new Allele <int>(214) }),
                new EqualsCondition("unconditional_2", new IAllele[] { new Allele <double>(-4) }),
            };
            var oneConditionMet = new List <EqualsCondition>
            {
                new EqualsCondition("unconditional", new IAllele[] { new Allele <int>(214) }),
                new EqualsCondition("unconditional_2", new IAllele[] { new Allele <double>(-8) }),
            };
            var specification = new ParameterConfigurationSpaceSpecification(
                parameters,
                new Dictionary <string, List <EqualsCondition> > {
                { "conditions_met", conditionsMet }, { "one_condition_met", oneConditionMet }
            },
                new List <ForbiddenParameterCombination>());

            var parameterValues = new Dictionary <string, IAllele>
            {
                ["unconditional"]     = new Allele <int>(214),
                ["unconditional_2"]   = new Allele <double>(-4),
                ["conditions_met"]    = new Allele <int>(24),
                ["one_condition_met"] = new Allele <int>(23),
            };
            var activeParameters = specification.ExtractActiveParameters(parameterValues);

            Assert.Equal(
                3,
                activeParameters.Count);
            foreach (var expectedParameter in parameterValues.Where(p => !Equals("one_condition_met", p.Key)))
            {
                if (!activeParameters.TryGetValue(expectedParameter.Key, out var activeValue))
                {
                    Assert.True(false, $"{expectedParameter.Key} should be active.");
                }

                Assert.Equal(
                    expectedParameter.Value,
                    activeValue);
            }
        }
Example #6
0
        /// <summary>
        /// Creates a flat <see cref="ParameterTree"/> using the specified configuration.
        /// </summary>
        /// <param name="parameterConfiguration">The parameter configuration.</param>
        /// <returns>The created <see cref="ParameterTree"/>.</returns>
        public static ParameterTree CreateParameterTree(ParameterConfigurationSpaceSpecification parameterConfiguration)
        {
            if (parameterConfiguration == null)
            {
                throw new ArgumentNullException(nameof(parameterConfiguration));
            }

            var root = new AndNode();

            foreach (var parameter in parameterConfiguration.Parameters)
            {
                root.AddChild(parameter);
            }

            return(new ParameterTree(root));
        }
Example #7
0
        public void MakeGenomeValidCanHandleMultipleIssues()
        {
            // Create a specification with dependent rules.
            var parameters = new List <IParameterNode>
            {
                new ValueNode <int>("a", new IntegerDomain(-2, 4)),
                new ValueNode <int>("Forbidden", new CategoricalDomain <int>(new List <int> {
                    6, 89
                })),
                new ValueNode <int>("c", new IntegerDomain(-2, 4)),
            };
            var forbiddenValue = new Dictionary <string, IAllele> {
                { "Forbidden", new Allele <int>(6) }
            };
            var dependentRule = new Dictionary <string, IAllele> {
                { "a", new Allele <int>(2) }, { "Forbidden", new Allele <int>(89) }
            };
            var forbiddenCombinations = new List <ForbiddenParameterCombination>
            {
                new ForbiddenParameterCombination(dependentRule),
                new ForbiddenParameterCombination(forbiddenValue),
            };
            var multipleParameterSpecification = new ParameterConfigurationSpaceSpecification(
                parameters,
                new Dictionary <string, List <EqualsCondition> >(),
                forbiddenCombinations);

            this._genomeBuilder = new ParameterConfigurationSpaceGenomeBuilder(
                AcLibUtils.CreateParameterTree(multipleParameterSpecification),
                multipleParameterSpecification,
                this._configuration);

            // Create an genome which is invalid and needs at least two mutations to get valid.
            var genome = new Genome();

            genome.SetGene("a", new Allele <int>(2));
            genome.SetGene("Forbidden", new Allele <int>(6));
            genome.SetGene("c", new Allele <int>(-1));

            this._genomeBuilder.MakeGenomeValid(genome);

            Assert.Equal(89, genome.GetGeneValue("Forbidden").GetValue());
            Assert.NotEqual(2, genome.GetGeneValue("a").GetValue());
            Assert.Equal(-1, genome.GetGeneValue("c").GetValue());
        }
Example #8
0
                                       GenomePredictionForestModel <GenomePredictionTree>, ReuseOldTreesStrategy> BuildRuntimeTuner(
            ParameterTree parameterTree,
            Scenario scenario,
            ParameterConfigurationSpaceSpecification parameterSpecification,
            IEnumerable <InstanceSeedFile> trainingInstances,
            IEnumerable <InstanceSeedFile> testInstances,
            AlgorithmTunerConfiguration configuration)
        {
            LoggingHelper.WriteLine(VerbosityLevel.Info, $"Tuning '{scenario.Command}' for PAR-{scenario.PenalizationFactor}.");
            var runtimeTuner =
                new AlgorithmTuner <RuntimeRunner, InstanceSeedFile, RuntimeResult, StandardRandomForestLearner <ReuseOldTreesStrategy>,
                                    GenomePredictionForestModel <GenomePredictionTree>, ReuseOldTreesStrategy>(
                    targetAlgorithmFactory: new RuntimeRunnerFactory(scenario, parameterSpecification),
                    runEvaluator: new SortByPenalizedRuntime <InstanceSeedFile>(scenario.PenalizationFactor, configuration.CpuTimeout),
                    trainingInstances: trainingInstances,
                    parameterTree: parameterTree,
                    configuration: configuration,
                    genomeBuilder: new ParameterConfigurationSpaceGenomeBuilder(parameterTree, parameterSpecification, configuration));

            runtimeTuner.SetTestInstances(testInstances);
            return(runtimeTuner);
        }
Example #9
0
                                       GenomePredictionForestModel <GenomePredictionTree>, ReuseOldTreesStrategy> BuildValueTuner(
            ParameterTree parameterTree,
            Scenario scenario,
            ParameterConfigurationSpaceSpecification parameterSpecification,
            IEnumerable <InstanceSeedFile> trainingInstances,
            IEnumerable <InstanceSeedFile> testInstances,
            AlgorithmTunerConfiguration configuration)
        {
            LoggingHelper.WriteLine(VerbosityLevel.Info, $"Tuning '{scenario.Command}' for minimum cost.");
            var qualityTuner =
                new AlgorithmTuner <QualityRunner, InstanceSeedFile, ContinuousResult, StandardRandomForestLearner <ReuseOldTreesStrategy>,
                                    GenomePredictionForestModel <GenomePredictionTree>, ReuseOldTreesStrategy>(
                    targetAlgorithmFactory: new QualityRunnerFactory(scenario, parameterSpecification),
                    runEvaluator: new SortByValue <InstanceSeedFile>(ascending: true),
                    trainingInstances: trainingInstances,
                    parameterTree: parameterTree,
                    configuration: configuration,
                    genomeBuilder: new ParameterConfigurationSpaceGenomeBuilder(parameterTree, parameterSpecification, configuration));

            qualityTuner.SetTestInstances(testInstances);
            return(qualityTuner);
        }
Example #10
0
        public void MakeGenomeValidThrowsForImpossibleTasks()
        {
            // Create a specification in which every value is forbidden.
            var parameters = new List <IParameterNode>
            {
                new ValueNode <int>("a", new CategoricalDomain <int>(new List <int> {
                    7, -12
                }))
            };

            var forbiddenValue = new Dictionary <string, IAllele> {
                { "a", new Allele <int>(7) }
            };
            var secondForbidden = new Dictionary <string, IAllele> {
                { "a", new Allele <int>(-12) }
            };
            var forbiddenCombinations = new List <ForbiddenParameterCombination>
            {
                new ForbiddenParameterCombination(forbiddenValue),
                new ForbiddenParameterCombination(secondForbidden),
            };

            var impossibleSpecification = new ParameterConfigurationSpaceSpecification(
                parameters,
                new Dictionary <string, List <EqualsCondition> >(),
                forbiddenCombinations);

            this._genomeBuilder = new ParameterConfigurationSpaceGenomeBuilder(
                AcLibUtils.CreateParameterTree(impossibleSpecification),
                impossibleSpecification,
                this._configuration);

            // Try to repair a genome.
            var genome = new Genome();

            genome.SetGene("a", new Allele <int>(7));
            Assert.Throws <TimeoutException>(() => this._genomeBuilder.MakeGenomeValid(genome));
        }
Example #11
0
        public void CreateParameterTreeCreatesFlatTree()
        {
            var parameters = new List <IParameterNode>
            {
                new ValueNode <string>("a", new CategoricalDomain <string>(new List <string> {
                    "0", "1"
                })),
                new ValueNode <int>("b", new DiscreteLogDomain(1, 1024)),
                new ValueNode <double>("c", new ContinuousDomain(-1.02, 2.6)),
            };
            var specification = new ParameterConfigurationSpaceSpecification(
                parameters,
                new Dictionary <string, List <EqualsCondition> >(),
                new List <ForbiddenParameterCombination>());
            var tree = AcLibUtils.CreateParameterTree(specification);

            Assert.Equal(3, tree.GetParameters().Count());
            foreach (var parameter in parameters)
            {
                Assert.True(
                    tree.Root.Children.Contains(parameter),
                    $"{parameter} was not placed directly below the parameter tree root.");
            }
        }
Example #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RunnerFactoryBase{TTargetAlgorithm,TResult}"/>
 /// class.
 /// </summary>
 /// <param name="scenario">The ACLib scenario.</param>
 /// <param name="parameterSpecification">
 /// A specification defining, among other things, parameter activity conditions.
 /// </param>
 protected RunnerFactoryBase(Scenario scenario, ParameterConfigurationSpaceSpecification parameterSpecification)
 {
     this.Scenario = scenario ?? throw new ArgumentNullException(nameof(scenario));
     this._parameterSpecification = parameterSpecification ??
                                    throw new ArgumentNullException(nameof(parameterSpecification));
 }
Example #13
0
 /// <summary>
 /// Initializes a new instance of the <see cref="QualityRunnerFactory"/> class.
 /// </summary>
 /// <param name="scenario">The ACLib scenario.</param>
 /// <param name="parameterSpecification">
 /// A specification defining, among other things, parameter activity conditions.
 /// </param>
 public QualityRunnerFactory(Scenario scenario, ParameterConfigurationSpaceSpecification parameterSpecification)
     : base(scenario, parameterSpecification)
 {
 }