//public IList<Constraint> GetSynthesizedModel() //{ // return SynthesizedModel; //} //public IList<Constraint> GetReferenceModel() //{ // return Benchmark.Constraints; //} public virtual MathModel SynthesizeModel(Point[] trainingPoints) { var offspringPopulationSize = ExperimentParameters.OffspringPopulationSize; var numberOfGenerations = ExperimentParameters.NumberOfGenerations; Evaluator.PositivePoints = trainingPoints.Where(tp => tp.ClassificationType == ClassificationType.Positive).ToArray(); Evaluator.NegativePoints = trainingPoints.Where(tp => tp.ClassificationType == ClassificationType.Negative).ToArray(); BasePopulation = PopulationGenerator.GeneratePopulation(ExperimentParameters); for (var i = 0; i < offspringPopulationSize; i++) { OffspringPopulation[i] = new Solution(ExperimentParameters); } InitialPopulation = BasePopulation.DeepCopyByExpressionTree(); Stoper.Restart(); for (var i = 0; i < numberOfGenerations; i++) { Evolve(offspringPopulationSize); } Stoper.Stop(); Statistics.TotalEvolutionTime = Stoper.Elapsed; Statistics.MeanSingleGenerationEvolutionTime = TimeSpan.FromTicks(Statistics.TotalEvolutionTime.Ticks / numberOfGenerations); Stoper.Restart(); SynthesizedModel = RedundantConstriantsRemover.ApplyProcessing(BasePopulation.First().GetConstraints(ExperimentParameters)); Stoper.Stop(); Statistics.RedundantConstraintsRemovingTime = Stoper.Elapsed; Statistics.TotalSynthesisTime = Statistics.TotalEvolutionTime + Stoper.Elapsed; Stoper.Reset(); MathModel = new MathModel(SynthesizedModel, Benchmark); return(MathModel); }
public MathModel SynthesizeModel(Point[] trainingPoints) { var means = trainingPoints.Means(); var standardDeviations = trainingPoints.StandardDeviations(means); if (Parameters.UseDataNormalization) { trainingPoints = _pointsNormalizer.ApplyProcessing(trainingPoints); NormalizedTrainingPoints = trainingPoints.DeepCopyByExpressionTree(); } var evolutionEnginesFactory = new EnginesFactory(); var evolutionEngine = evolutionEnginesFactory.Create(Parameters.EvolutionParameters); var positiveTrainingPoints = trainingPoints.Where(tp => tp.ClassificationType == ClassificationType.Positive).ToArray(); var negativeTrainingPoints = trainingPoints.Where(tp => tp.ClassificationType == ClassificationType.Negative).ToArray(); var evaluator = new Evaluator(positiveTrainingPoints, negativeTrainingPoints, _constraintsBuilder); //HACK TODO //var numberOfConstraintsCoefficients = Parameters.MaximumNumberOfConstraints * (Parameters.NumberOfDimensions + 1); //var constraintsCoefficients = new List<double>(numberOfConstraintsCoefficients); //var benchmarkConstraintsIndexer = 0; //for (var i = 0; i < Parameters.MaximumNumberOfConstraints; i++) //{ // if (benchmarkConstraintsIndexer >= Benchmark.Constraints.Length) // benchmarkConstraintsIndexer = 0; // constraintsCoefficients.AddRange(Benchmark.Constraints[benchmarkConstraintsIndexer].Terms.Select(t => t.Coefficient)); // constraintsCoefficients.Add(Benchmark.Constraints[benchmarkConstraintsIndexer++].LimitingValue); //} //PopulationGeneratorBase.ObjectCoefficients = constraintsCoefficients.ToArray(); // Solution bestSolution; if (Parameters.UseSeeding) { var singleConstraintModel = Parameters.TypeOfBenchmark == BenchmarkType.Balln && Parameters.AllowQuadraticTerms ? Benchmark.Constraints.Take(1).DeepCopyByExpressionTree().ToArray() : new[] { new LinearConstraint(Benchmark.Constraints.First().Terms.Where(t => t.Type == TermType.Linear).ToArray(), 0) }; var singleConstraintBuilder = new ConstraintsBuilder(singleConstraintModel); var singleConstraintEvaluator = new Evaluator(positiveTrainingPoints, negativeTrainingPoints, singleConstraintBuilder); var seedingProcessor = new SeedingProcessor(singleConstraintEvaluator, _constraintsBuilder, positiveTrainingPoints); bestSolution = evolutionEngine.RunEvolution(evaluator, seedingProcessor); } else { bestSolution = evolutionEngine.RunEvolution(evaluator); } CoreEvolutionSteps = evolutionEngine.EvolutionSteps; Statistics.EvolutionStatistics = evolutionEngine.Statistics; var synthesizedConstraints = _constraintsBuilder.BuildConstraints(bestSolution); if (Parameters.UseDataNormalization) { NormalizedSynthesizedConstraints = synthesizedConstraints.DeepCopyByExpressionTree(); _constaintsDenormalizer = new StandardScoreConstraintsDenormalizer(means, standardDeviations); synthesizedConstraints = _constaintsDenormalizer.ApplyProcessing(synthesizedConstraints); } if (Parameters.TrackEvolutionSteps) { var evolutionStepsAsSolutions = evolutionEngine.EvolutionStepsSimple.ToList(); foreach (var evolutionStepsAsSolution in evolutionStepsAsSolutions) { var evolutionStep = _constraintsBuilder.BuildConstraints(evolutionStepsAsSolution); if (Parameters.UseDataNormalization) { NormalizedEvolutionSteps.Add(evolutionStep.DeepCopyByExpressionTree()); evolutionStep = _constaintsDenormalizer.ApplyProcessing(evolutionStep); } EvolutionSteps.Add(evolutionStep); } } if (Parameters.UseRedundantConstraintsRemoving) { _stoper.Restart(); synthesizedConstraints = _redundantConstraintsRemover.ApplyProcessing(synthesizedConstraints); _stoper.Stop(); Statistics.RedundantConstraintsRemovingTime = _stoper.Elapsed; } MathModel = new MathModel(synthesizedConstraints, Benchmark); Statistics.NumberOfConstraints = synthesizedConstraints.Length; Statistics.MeanAngle = Parameters.TypeOfBenchmark != BenchmarkType.Balln ? _meanAngleCalculator.Calculate(synthesizedConstraints, Benchmark.Constraints) : double.NaN; return(MathModel); }