}                                                                                          // maximize R² and minimize average similarity

        public override IOperation InstrumentedApply()
        {
            IEnumerable <int> rows = GenerateRowsToEvaluate();
            var solution           = SymbolicExpressionTreeParameter.ActualValue;
            var problemData        = ProblemDataParameter.ActualValue;
            var interpreter        = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
            var estimationLimits   = EstimationLimitsParameter.ActualValue;
            var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value;

            if (UseConstantOptimization)
            {
                SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows, applyLinearScaling, ConstantOptimizationIterations, updateVariableWeights: ConstantOptimizationUpdateVariableWeights, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper);
            }

            double r2 = SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator.Calculate(interpreter, solution, estimationLimits.Lower, estimationLimits.Upper, problemData, rows, applyLinearScaling);

            if (DecimalPlaces >= 0)
            {
                r2 = Math.Round(r2, DecimalPlaces);
            }

            lock (locker) {
                if (AverageSimilarityParameter.ActualValue == null)
                {
                    var context = new ExecutionContext(null, SimilarityCalculator, ExecutionContext.Scope.Parent);
                    SimilarityCalculator.StrictSimilarity = StrictSimilarity;
                    SimilarityCalculator.Execute(context, CancellationToken);
                }
            }
            var avgSimilarity = AverageSimilarityParameter.ActualValue.Value;

            QualitiesParameter.ActualValue = new DoubleArray(new[] { r2, avgSimilarity });
            return(base.InstrumentedApply());
        }
        }                                                                                          // maximize R² and minimize model complexity

        public override IOperation InstrumentedApply()
        {
            IEnumerable <int> rows = GenerateRowsToEvaluate();
            var solution           = SymbolicExpressionTreeParameter.ActualValue;
            var problemData        = ProblemDataParameter.ActualValue;
            var interpreter        = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
            var estimationLimits   = EstimationLimitsParameter.ActualValue;
            var applyLinearScaling = ApplyLinearScalingParameter.ActualValue.Value;

            if (UseConstantOptimization)
            {
                SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, solution, problemData, rows, applyLinearScaling, ConstantOptimizationIterations, updateVariableWeights: ConstantOptimizationUpdateVariableWeights, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper);
            }
            double[] qualities = Calculate(interpreter, solution, estimationLimits.Lower, estimationLimits.Upper, problemData, rows, applyLinearScaling, DecimalPlaces);
            QualitiesParameter.ActualValue = new DoubleArray(qualities);
            return(base.InstrumentedApply());
        }
 protected SymbolicRegressionConstantOptimizationEvaluator(SymbolicRegressionConstantOptimizationEvaluator original, Cloner cloner)
     : base(original, cloner)
 {
 }
 protected SymbolicRegressionConstantOptimizationEvaluator(SymbolicRegressionConstantOptimizationEvaluator original, Cloner cloner)
   : base(original, cloner) {
 }