// wrap an actual model in a surrograte
 public GradientBoostedTreesModelSurrogate(IRegressionProblemData trainingProblemData, uint seed,
                                           ILossFunction lossFunction, int iterations, int maxSize, double r, double m, double nu,
                                           IGradientBoostedTreesModel model)
     : this(trainingProblemData, seed, lossFunction, iterations, maxSize, r, m, nu)
 {
     this.actualModel = model;
 }
 // forward message to actual model (recalculate model first if necessary)
 public override IEnumerable <double> GetEstimatedValues(IDataset dataset, IEnumerable <int> rows)
 {
     if (actualModel == null)
     {
         actualModel = RecalculateModel();
     }
     return(actualModel.GetEstimatedValues(dataset, rows));
 }
    private GradientBoostedTreesModelSurrogate(GradientBoostedTreesModelSurrogate original, Cloner cloner)
      : base(original, cloner) {
      if (original.actualModel != null) this.actualModel = cloner.Clone(original.actualModel);

      this.trainingProblemData = cloner.Clone(original.trainingProblemData);
      this.lossFunction = cloner.Clone(original.lossFunction);
      this.seed = original.seed;
      this.iterations = original.iterations;
      this.maxSize = original.maxSize;
      this.r = original.r;
      this.m = original.m;
      this.nu = original.nu;
    }
        private GradientBoostedTreesModelSurrogate(GradientBoostedTreesModelSurrogate original, Cloner cloner)
            : base(original, cloner)
        {
            if (original.actualModel != null)
            {
                this.actualModel = cloner.Clone(original.actualModel);
            }

            this.trainingProblemData = cloner.Clone(original.trainingProblemData);
            this.lossFunction        = cloner.Clone(original.lossFunction);
            this.seed       = original.seed;
            this.iterations = original.iterations;
            this.maxSize    = original.maxSize;
            this.r          = original.r;
            this.m          = original.m;
            this.nu         = original.nu;
        }
        private GradientBoostedTreesModelSurrogate(GradientBoostedTreesModelSurrogate original, Cloner cloner)
            : base(original, cloner)
        {
            IGradientBoostedTreesModel clonedModel = null;

            if (original.actualModel.IsValueCreated)
            {
                clonedModel = cloner.Clone(original.ActualModel);
            }
            actualModel = new Lazy <IGradientBoostedTreesModel>(CreateLazyInitFunc(clonedModel)); // only capture clonedModel in the closure

            this.trainingProblemData = cloner.Clone(original.trainingProblemData);
            this.lossFunction        = cloner.Clone(original.lossFunction);
            this.seed       = original.seed;
            this.iterations = original.iterations;
            this.maxSize    = original.maxSize;
            this.r          = original.r;
            this.m          = original.m;
            this.nu         = original.nu;
        }
 private Func <IGradientBoostedTreesModel> CreateLazyInitFunc(IGradientBoostedTreesModel clonedModel)
 {
     return(() => {
         return clonedModel ?? RecalculateModel();
     });
 }
 // wrap an actual model in a surrograte
 public GradientBoostedTreesModelSurrogate(IGradientBoostedTreesModel model, IRegressionProblemData trainingProblemData, uint seed,
                                           ILossFunction lossFunction, int iterations, int maxSize, double r, double m, double nu)
     : this(trainingProblemData, seed, lossFunction, iterations, maxSize, r, m, nu)
 {
     actualModel = new Lazy <IGradientBoostedTreesModel>(() => model);
 }
 // wrap an actual model in a surrograte
 public GradientBoostedTreesModelSurrogate(IRegressionProblemData trainingProblemData, uint seed,
   ILossFunction lossFunction, int iterations, int maxSize, double r, double m, double nu,
   IGradientBoostedTreesModel model)
   : this(trainingProblemData, seed, lossFunction, iterations, maxSize, r, m, nu) {
   this.actualModel = model;
 }
 // forward message to actual model (recalculate model first if necessary)
 public override IEnumerable<double> GetEstimatedValues(IDataset dataset, IEnumerable<int> rows) {
   if (actualModel == null) actualModel = RecalculateModel();
   return actualModel.GetEstimatedValues(dataset, rows);
 }