using HeuristicLab.Problems.ProgramSynthesis;

namespace HeuristicLab.BenchmarkSuite.Problems {
  public class LastIndexOfZero : BenchmarkSuiteDataDescriptor {
    private const string name = "Last Index of Zero - Hard";
    private const string fileName = "LastIndexOfZero.csv";
    private const string description = "Given a vector of integers, at least one of which is 0, return the index of the last occurrence of 0 in the vector.";

    protected override string FileName { get { return fileName; } }
    public override string Name { get { return name; } }
    public override string Description { get { return description; } }
    protected override int InputArgumentCount { get { return 1; } }
    protected override int OutputArgumentCount { get { return 1; } }

    public override ProblemData CreateProblemData() {
      return new ProblemData(ProblemType.LastIndexOfZero) {
        Name = Name,
        Description = Description,
        ProgramExecutionBudget = 45000000,
        Examples = CloneExamples(),
        BestResult = 0,
        WorstResult = 1000000,
        InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
        TrainingCount = 150,
        TestCount = 1000,
        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.IntegerVector,
        MaxSize = 300,
        EvalLimit = 600,
        ErcOptions = {
          ErcProbability = 0.05,
          IntegerErcOptions = new IntegerErcOptions(
            new IntegerConstantErc(0),
            new IntegerRangeErc(-50, 50))
          }
      };
    }

    protected override Example ParseExample(string[] input, string[] output) {
      return new Example {
        InputArgs = input,
        OutputArgs = output,
        InputIntegerVector = new[] { ExampleArgumentConverter.ConvertIntegers(input[0]) },
        OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0]),
      };
    }
  }
}