public void TestFloatValueSweep(string name, int min, int max, bool logBase, int stepSize, int numSteps, string valueText)
        {
            var paramSweep = new FloatValueGenerator(new FloatParamArguments()
            {
                Name = name, Min = min, Max = max, LogBase = logBase, StepSize = stepSize, NumSteps = numSteps
            });
            IParameterValue value = paramSweep.CreateFromNormalized(0.5);

            Assert.Equal(name, value.Name);
            Assert.Equal(valueText, value.ValueText);
        }
        public void TestFloatValueGeneratorRoundTrip()
        {
            var paramSweep = new FloatValueGenerator(new FloatParamArguments()
            {
                Name = "bla", Min = 1, Max = 5
            });
            var random                  = new Random(123);
            var normalizedValue         = (float)random.NextDouble();
            var value                   = (FloatParameterValue)paramSweep.CreateFromNormalized(normalizedValue);
            var originalNormalizedValue = paramSweep.NormalizeValue(value);

            Assert.Equal(normalizedValue, originalNormalizedValue);

            var originalValue = (FloatParameterValue)paramSweep.CreateFromNormalized(normalizedValue);

            Assert.Equal(originalValue.Value, value.Value);
        }
        public void FloatValueGenerator_should_generate_value_from_normalize(float min, float max, int step, bool logbase, float expect)
        {
            var option = new FloatValueGenerator.Option()
            {
                Min     = min,
                Max     = max,
                Name    = "float",
                Steps   = step,
                LogBase = logbase,
            };

            var generator = new FloatValueGenerator(option);

            generator.CreateFromNormalized(1.0f).RawValue.Should().Be(max);
            generator.CreateFromNormalized(0f).RawValue.Should().Be(min);
            generator.CreateFromNormalized(0.5f).RawValue.Should().Be(expect);
        }
        public void FloatValueGenerator_should_work_with_index(float min, float max, int step, bool logBase, int count)
        {
            var option = new FloatValueGenerator.Option()
            {
                Min     = min,
                Max     = max,
                Steps   = step,
                Name    = "float",
                LogBase = logBase,
            };

            var generator = new FloatValueGenerator(option);

            generator.Count.Should().Be(count + 1);
            generator[0].RawValue.Should().Be(min);
            ((float)generator[count].RawValue)
            .Should()
            .Be(max);
        }
        public void SmacQuickRunTest()
        {
            var numInitialPopulation = 10;

            var floatValueGenerator = new FloatValueGenerator(new FloatParamArguments()
            {
                Name = "float", Min = 1, Max = 1000
            });
            var floatLogValueGenerator = new FloatValueGenerator(new FloatParamArguments()
            {
                Name = "floatLog", Min = 1, Max = 1000, LogBase = true
            });
            var longValueGenerator = new LongValueGenerator(new LongParamArguments()
            {
                Name = "long", Min = 1, Max = 1000
            });
            var longLogValueGenerator = new LongValueGenerator(new LongParamArguments()
            {
                Name = "longLog", Min = 1, Max = 1000, LogBase = true
            });
            var discreteValueGeneator = new DiscreteValueGenerator(new DiscreteParamArguments()
            {
                Name = "discrete", Values = new[] { "200", "400", "600", "800" }
            });

            var sweeper = new SmacSweeper(new MLContext(), new SmacSweeper.Arguments()
            {
                SweptParameters = new IValueGenerator[] {
                    floatValueGenerator,
                    floatLogValueGenerator,
                    longValueGenerator,
                    longLogValueGenerator,
                    discreteValueGeneator
                },
                NumberInitialPopulation = numInitialPopulation
            });

            // sanity check grid
            Assert.NotNull(floatValueGenerator[0].ValueText);
            Assert.NotNull(floatLogValueGenerator[0].ValueText);
            Assert.NotNull(longValueGenerator[0].ValueText);
            Assert.NotNull(longLogValueGenerator[0].ValueText);
            Assert.NotNull(discreteValueGeneator[0].ValueText);

            List <RunResult> results = new List <RunResult>();

            RunResult bestResult = null;

            for (var i = 0; i < numInitialPopulation + 1; i++)
            {
                ParameterSet[] pars = sweeper.ProposeSweeps(1, results);

                foreach (ParameterSet p in pars)
                {
                    float x1 = float.Parse(p["float"].ValueText);
                    float x2 = float.Parse(p["floatLog"].ValueText);
                    long  x3 = long.Parse(p["long"].ValueText);
                    long  x4 = long.Parse(p["longLog"].ValueText);
                    int   x5 = int.Parse(p["discrete"].ValueText);

                    double metric = x1 + x2 + x3 + x4 + x5;

                    RunResult result = new RunResult(p, metric, true);
                    if (bestResult == null || bestResult.MetricValue < metric)
                    {
                        bestResult = result;
                    }
                    results.Add(result);

                    Console.WriteLine($"{metric}\t{x1},{x2}");
                }
            }

            Console.WriteLine($"Best: {bestResult.MetricValue}");

            Assert.NotNull(bestResult);
            Assert.True(bestResult.MetricValue > 0);
        }