First, we create the functions used in the simulations: generators (+ their means & variances), gains, filters, etc.

library(tidyverse)
library(rpart)
generator <- function(x, type, c){        # Generator functions: all except poly
    if(type == "linear"){return(c*x)}
    if(type == "quad"){return((x-c)^2)}
    if(type == "exp"){return(exp(-x*c))}
    if(type == "log"){return(log(x+c))}
    if(type == "sin"){return(sin(x*c)/c)}
}
m_gen <- function(type, c){               # Average value of generator
    if(type == "linear") return(c/2) 
    if(type == "quad") return(1/3-c+c^2)
    if(type == "exp") return((1-exp(-c))/c)
    if(type == "log") return(-1 - c*log(c)+(1+c)*log(1+c))
    if(type == "sin") return((1-cos(c))/c^2)
    if(type == "poly") {return(0)}        # Not computed 
}
var_gen <- function(type, c){             # Variance of generator
    if(type == "linear") return(c^2/12) 
    if(type == "quad") return((15*c^2-15*c+4)/45)
    if(type == "exp") return(exp(-2*c)*(exp(c)-1)*(2+c+exp(c)*(c-2))/2/(c^2))
    if(type == "log") return(1 - c*(1+c)*(log(c)-log(1+c))^2)
    if(type == "sin") return((2*c^2-c*sin(2*c)+8*cos(c)-2*cos(2*c)-6)/4/c^4)
}
fin_gen <- function(x, type,c){           # Generator with mean removed
    if(type == "poly"){
        return(gen_poly(x, c))
    } else
    return(generator(x, type, c) - m_gen(type, c))
}
sim_gen <- function(x, type, c, target_sd){ # Simulation of one point with noise
    return(fin_gen(x, type, c) + target_sd * rnorm(length(x))) 
}
gain <- function(fit){                      # Gain extracted from tree
    out_fit <- fit$frame
    var20 <- out_fit$dev[1]
    var21 <- out_fit$dev[2]
    var22 <- out_fit$dev[3]
    return(var20-(var21+var22))
}
filter_q <- function(data, q, y){           # Filtering function
    return(filter(data, y > quantile(y, 1-q) | y < quantile(y, q)))
}
gen_poly <- function(x, cc){                # Random function for the polynomial generator
    pars <- rnorm(cc) 
    while(sum(sign(pars))!=0){pars <- rnorm(cc) } # To make sure that the behavior is not too montonous
    m <- sum(pars/(2:(cc+1)))
    x <- sapply(x, `^`, 1:cc)
    p <- matrix(rep(pars, ncol(x)), nrow = cc, byrow = F)
    out <- colSums(p*x) - m
    return(out / sd(out) / runif(1, min = 12, max = 21))
}
ggplot(data.frame(x = c(0,1)), aes(x = x)) + stat_function(fun = gen_poly, args = list(cc = 6)) # Example of polynomial generator

Then, we create the simulation canvas & loop (via pmap to speed up the process). The simulations can take a lot of time. We chose modest parameters below.

nb_sim <- 50                                    # Number of simulations: 1000 in the paper
type <- c("linear", "quad", "sin", "exp", "log", "poly")
cc <- seq(0.1,0.4, length.out = nb_sim)         # For linear only, changes below
target_sd <- c(0.05)                             # Several values of noise can be tested
q <- c(0.15)                                    # Several values for q can also be tested
pars <- expand.grid(type, cc, target_sd,q)      # Initial parameters
colnames(pars) <- c("type", "cc", "target_sd", "q")
pars <- pars %>%                                # We alter parameter ranges below to get homogeneous gains
    group_by(target_sd, q) %>%
    mutate(cc = ifelse(type == "linear", seq(0.1,0.3, length.out = nb_sim), cc),
           cc = ifelse(type == "exp", seq(0.1,0.32, length.out = nb_sim), cc),
           cc = ifelse(type == "sin", seq(7,14, length.out = nb_sim), cc),
           cc = ifelse(type == "quad", seq(0.43,0.59, length.out = nb_sim), cc),
           cc = ifelse(type == "log", seq(3,13, length.out = nb_sim), cc),
           cc = ifelse(type == "poly", 6, cc))
type <- as.character(pars$type)                 # Parameter: type
cc <- matrix(pars$cc)                           # Parameter: parameter!
target_sd <- matrix(pars$target_sd)             # Parameter: level of noise
q <- matrix(pars$q)                             # Parameter: level of filter
gainz <- function(nb_points, target_sd, q, type, cc){ # Function that wraps the simulations
    x <- runif(nb_points)                             # Simulation of x
    y <- sim_gen(x, type, cc, target_sd)              # Simulation of y
    data <- data.frame(y,x)                           # Data (general case)
    fit <- rpart(y ~ x, data = data, cp = 0.0001, maxdepth = 1)                 # Tree fitting (general case)
    gain_res <- gain(fit)                             # Gain (benchmark)
    fit <- rpart(y ~ x, data = filter_q(data, q, y), cp = 0.0001, maxdepth = 1) # Tree on filtered data
    gain_res_filtered <- gain(fit)                    # Gain (post-filter)
    if(type == "poly"){                               # Below, we keep the level of generated variance  
        var_g <- var(y) - target_sd^2
    } else {
        var_g <- var_gen(type, cc)
    }
    return(c(gain_res, gain_res_filtered, var_g))
}
grd <- pmap(list(target_sd, q, type, cc),             # Run the simulations!
            gainz,                                    # On this function
            nb_points = 10^5)                         # Number of points simulated: 10^6 in the paper
res <- grd %>% unlist %>% matrix(ncol = 3, byrow = TRUE)                   # Organize results (1)
res <- data.frame(type = type, cc = cc, q = q, target_sd, gain = res[,1],  # Organize results (2)
                  gain_filtered = res[,2], var_g = res[,3])
# save(res, file = "res_agg.RData")

Finally, the plot.

res %>% 
    ggplot(aes(x = gain, y = gain_filtered, color = type)) + geom_point(size = 0.5) +
    scale_colour_manual("Legend", values = c("#ff0000","#ff0000","#ff0000","#787878","#00ccff","#9900cc")) 

The important feature is the red enveloppe: for a given initial gain, the best improvement is obtained by generators that are strictly increasing.

LS0tCnRpdGxlOiAiR2FpbnMgcG9zdC1maWx0ZXI6IHNpbXVsYXRpb25zIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKCkZpcnN0LCB3ZSBjcmVhdGUgdGhlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBzaW11bGF0aW9uczogZ2VuZXJhdG9ycyAoKyB0aGVpciBtZWFucyAmIHZhcmlhbmNlcyksIGdhaW5zLCBmaWx0ZXJzLCBldGMuCgpgYGB7ciBhZ2dfZGVmLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocnBhcnQpCmdlbmVyYXRvciA8LSBmdW5jdGlvbih4LCB0eXBlLCBjKXsgICAgICAgICMgR2VuZXJhdG9yIGZ1bmN0aW9uczogYWxsIGV4Y2VwdCBwb2x5CiAgICBpZih0eXBlID09ICJsaW5lYXIiKXtyZXR1cm4oYyp4KX0KICAgIGlmKHR5cGUgPT0gInF1YWQiKXtyZXR1cm4oKHgtYyleMil9CiAgICBpZih0eXBlID09ICJleHAiKXtyZXR1cm4oZXhwKC14KmMpKX0KICAgIGlmKHR5cGUgPT0gImxvZyIpe3JldHVybihsb2coeCtjKSl9CiAgICBpZih0eXBlID09ICJzaW4iKXtyZXR1cm4oc2luKHgqYykvYyl9Cn0KCm1fZ2VuIDwtIGZ1bmN0aW9uKHR5cGUsIGMpeyAgICAgICAgICAgICAgICMgQXZlcmFnZSB2YWx1ZSBvZiBnZW5lcmF0b3IKICAgIGlmKHR5cGUgPT0gImxpbmVhciIpIHJldHVybihjLzIpIAogICAgaWYodHlwZSA9PSAicXVhZCIpIHJldHVybigxLzMtYytjXjIpCiAgICBpZih0eXBlID09ICJleHAiKSByZXR1cm4oKDEtZXhwKC1jKSkvYykKICAgIGlmKHR5cGUgPT0gImxvZyIpIHJldHVybigtMSAtIGMqbG9nKGMpKygxK2MpKmxvZygxK2MpKQogICAgaWYodHlwZSA9PSAic2luIikgcmV0dXJuKCgxLWNvcyhjKSkvY14yKQogICAgaWYodHlwZSA9PSAicG9seSIpIHtyZXR1cm4oMCl9ICAgICAgICAjIE5vdCBjb21wdXRlZCAKfQoKdmFyX2dlbiA8LSBmdW5jdGlvbih0eXBlLCBjKXsgICAgICAgICAgICAgIyBWYXJpYW5jZSBvZiBnZW5lcmF0b3IKICAgIGlmKHR5cGUgPT0gImxpbmVhciIpIHJldHVybihjXjIvMTIpIAogICAgaWYodHlwZSA9PSAicXVhZCIpIHJldHVybigoMTUqY14yLTE1KmMrNCkvNDUpCiAgICBpZih0eXBlID09ICJleHAiKSByZXR1cm4oZXhwKC0yKmMpKihleHAoYyktMSkqKDIrYytleHAoYykqKGMtMikpLzIvKGNeMikpCiAgICBpZih0eXBlID09ICJsb2ciKSByZXR1cm4oMSAtIGMqKDErYykqKGxvZyhjKS1sb2coMStjKSleMikKICAgIGlmKHR5cGUgPT0gInNpbiIpIHJldHVybigoMipjXjItYypzaW4oMipjKSs4KmNvcyhjKS0yKmNvcygyKmMpLTYpLzQvY140KQp9CgpmaW5fZ2VuIDwtIGZ1bmN0aW9uKHgsIHR5cGUsYyl7ICAgICAgICAgICAjIEdlbmVyYXRvciB3aXRoIG1lYW4gcmVtb3ZlZAogICAgaWYodHlwZSA9PSAicG9seSIpewogICAgICAgIHJldHVybihnZW5fcG9seSh4LCBjKSkKICAgIH0gZWxzZQogICAgcmV0dXJuKGdlbmVyYXRvcih4LCB0eXBlLCBjKSAtIG1fZ2VuKHR5cGUsIGMpKQp9CgpzaW1fZ2VuIDwtIGZ1bmN0aW9uKHgsIHR5cGUsIGMsIHRhcmdldF9zZCl7ICMgU2ltdWxhdGlvbiBvZiBvbmUgcG9pbnQgd2l0aCBub2lzZQogICAgcmV0dXJuKGZpbl9nZW4oeCwgdHlwZSwgYykgKyB0YXJnZXRfc2QgKiBybm9ybShsZW5ndGgoeCkpKSAKfQoKZ2FpbiA8LSBmdW5jdGlvbihmaXQpeyAgICAgICAgICAgICAgICAgICAgICAjIEdhaW4gZXh0cmFjdGVkIGZyb20gdHJlZQogICAgb3V0X2ZpdCA8LSBmaXQkZnJhbWUKICAgIHZhcjIwIDwtIG91dF9maXQkZGV2WzFdCiAgICB2YXIyMSA8LSBvdXRfZml0JGRldlsyXQogICAgdmFyMjIgPC0gb3V0X2ZpdCRkZXZbM10KICAgIHJldHVybih2YXIyMC0odmFyMjErdmFyMjIpKQp9CgpmaWx0ZXJfcSA8LSBmdW5jdGlvbihkYXRhLCBxLCB5KXsgICAgICAgICAgICMgRmlsdGVyaW5nIGZ1bmN0aW9uCiAgICByZXR1cm4oZmlsdGVyKGRhdGEsIHkgPiBxdWFudGlsZSh5LCAxLXEpIHwgeSA8IHF1YW50aWxlKHksIHEpKSkKfQoKZ2VuX3BvbHkgPC0gZnVuY3Rpb24oeCwgY2MpeyAgICAgICAgICAgICAgICAjIFJhbmRvbSBmdW5jdGlvbiBmb3IgdGhlIHBvbHlub21pYWwgZ2VuZXJhdG9yCiAgICBwYXJzIDwtIHJub3JtKGNjKSAKICAgIHdoaWxlKHN1bShzaWduKHBhcnMpKSE9MCl7cGFycyA8LSBybm9ybShjYykgfSAjIFRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBiZWhhdmlvciBpcyBub3QgdG9vIG1vbnRvbm91cwogICAgbSA8LSBzdW0ocGFycy8oMjooY2MrMSkpKQogICAgeCA8LSBzYXBwbHkoeCwgYF5gLCAxOmNjKQogICAgcCA8LSBtYXRyaXgocmVwKHBhcnMsIG5jb2woeCkpLCBucm93ID0gY2MsIGJ5cm93ID0gRikKICAgIG91dCA8LSBjb2xTdW1zKHAqeCkgLSBtCiAgICByZXR1cm4ob3V0IC8gc2Qob3V0KSAvIHJ1bmlmKDEsIG1pbiA9IDEyLCBtYXggPSAyMSkpCn0KCmdncGxvdChkYXRhLmZyYW1lKHggPSBjKDAsMSkpLCBhZXMoeCA9IHgpKSArIHN0YXRfZnVuY3Rpb24oZnVuID0gZ2VuX3BvbHksIGFyZ3MgPSBsaXN0KGNjID0gNikpICMgRXhhbXBsZSBvZiBwb2x5bm9taWFsIGdlbmVyYXRvcgpgYGAKClRoZW4sIHdlIGNyZWF0ZSB0aGUgc2ltdWxhdGlvbiBjYW52YXMgJiBsb29wICh2aWEgKipwbWFwKiogdG8gc3BlZWQgdXAgdGhlIHByb2Nlc3MpLgpUaGUgc2ltdWxhdGlvbnMgY2FuIHRha2UgYSBsb3Qgb2YgdGltZS4gV2UgY2hvc2UgbW9kZXN0IHBhcmFtZXRlcnMgYmVsb3cuCgpgYGB7ciB0ZXN0cywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cm5iX3NpbSA8LSA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHNpbXVsYXRpb25zOiAxMDAwIGluIHRoZSBwYXBlcgp0eXBlIDwtIGMoImxpbmVhciIsICJxdWFkIiwgInNpbiIsICJleHAiLCAibG9nIiwgInBvbHkiKQpjYyA8LSBzZXEoMC4xLDAuNCwgbGVuZ3RoLm91dCA9IG5iX3NpbSkgICAgICAgICAjIEZvciBsaW5lYXIgb25seSwgY2hhbmdlcyBiZWxvdwp0YXJnZXRfc2QgPC0gYygwLjA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXZlcmFsIHZhbHVlcyBvZiBub2lzZSBjYW4gYmUgdGVzdGVkCnEgPC0gYygwLjE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2V2ZXJhbCB2YWx1ZXMgZm9yIHEgY2FuIGFsc28gYmUgdGVzdGVkCnBhcnMgPC0gZXhwYW5kLmdyaWQodHlwZSwgY2MsIHRhcmdldF9zZCxxKSAgICAgICMgSW5pdGlhbCBwYXJhbWV0ZXJzCmNvbG5hbWVzKHBhcnMpIDwtIGMoInR5cGUiLCAiY2MiLCAidGFyZ2V0X3NkIiwgInEiKQpwYXJzIDwtIHBhcnMgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGFsdGVyIHBhcmFtZXRlciByYW5nZXMgYmVsb3cgdG8gZ2V0IGhvbW9nZW5lb3VzIGdhaW5zCiAgICBncm91cF9ieSh0YXJnZXRfc2QsIHEpICU+JQogICAgbXV0YXRlKGNjID0gaWZlbHNlKHR5cGUgPT0gImxpbmVhciIsIHNlcSgwLjEsMC4zLCBsZW5ndGgub3V0ID0gbmJfc2ltKSwgY2MpLAogICAgICAgICAgIGNjID0gaWZlbHNlKHR5cGUgPT0gImV4cCIsIHNlcSgwLjEsMC4zMiwgbGVuZ3RoLm91dCA9IG5iX3NpbSksIGNjKSwKICAgICAgICAgICBjYyA9IGlmZWxzZSh0eXBlID09ICJzaW4iLCBzZXEoNywxNCwgbGVuZ3RoLm91dCA9IG5iX3NpbSksIGNjKSwKICAgICAgICAgICBjYyA9IGlmZWxzZSh0eXBlID09ICJxdWFkIiwgc2VxKDAuNDMsMC41OSwgbGVuZ3RoLm91dCA9IG5iX3NpbSksIGNjKSwKICAgICAgICAgICBjYyA9IGlmZWxzZSh0eXBlID09ICJsb2ciLCBzZXEoMywxMywgbGVuZ3RoLm91dCA9IG5iX3NpbSksIGNjKSwKICAgICAgICAgICBjYyA9IGlmZWxzZSh0eXBlID09ICJwb2x5IiwgNiwgY2MpKQp0eXBlIDwtIGFzLmNoYXJhY3RlcihwYXJzJHR5cGUpICAgICAgICAgICAgICAgICAjIFBhcmFtZXRlcjogdHlwZQpjYyA8LSBtYXRyaXgocGFycyRjYykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFBhcmFtZXRlcjogcGFyYW1ldGVyIQp0YXJnZXRfc2QgPC0gbWF0cml4KHBhcnMkdGFyZ2V0X3NkKSAgICAgICAgICAgICAjIFBhcmFtZXRlcjogbGV2ZWwgb2Ygbm9pc2UKcSA8LSBtYXRyaXgocGFycyRxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXI6IGxldmVsIG9mIGZpbHRlcgoKZ2FpbnogPC0gZnVuY3Rpb24obmJfcG9pbnRzLCB0YXJnZXRfc2QsIHEsIHR5cGUsIGNjKXsgIyBGdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBzaW11bGF0aW9ucwogICAgeCA8LSBydW5pZihuYl9wb2ludHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbXVsYXRpb24gb2YgeAogICAgeSA8LSBzaW1fZ2VuKHgsIHR5cGUsIGNjLCB0YXJnZXRfc2QpICAgICAgICAgICAgICAjIFNpbXVsYXRpb24gb2YgeQogICAgZGF0YSA8LSBkYXRhLmZyYW1lKHkseCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERhdGEgKGdlbmVyYWwgY2FzZSkKICAgIGZpdCA8LSBycGFydCh5IH4geCwgZGF0YSA9IGRhdGEsIGNwID0gMC4wMDAxLCBtYXhkZXB0aCA9IDEpICAgICAgICAgICAgICAgICAjIFRyZWUgZml0dGluZyAoZ2VuZXJhbCBjYXNlKQogICAgZ2Fpbl9yZXMgPC0gZ2FpbihmaXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEdhaW4gKGJlbmNobWFyaykKICAgIGZpdCA8LSBycGFydCh5IH4geCwgZGF0YSA9IGZpbHRlcl9xKGRhdGEsIHEsIHkpLCBjcCA9IDAuMDAwMSwgbWF4ZGVwdGggPSAxKSAjIFRyZWUgb24gZmlsdGVyZWQgZGF0YQogICAgZ2Fpbl9yZXNfZmlsdGVyZWQgPC0gZ2FpbihmaXQpICAgICAgICAgICAgICAgICAgICAjIEdhaW4gKHBvc3QtZmlsdGVyKQogICAgaWYodHlwZSA9PSAicG9seSIpeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEJlbG93LCB3ZSBrZWVwIHRoZSBsZXZlbCBvZiBnZW5lcmF0ZWQgdmFyaWFuY2UgIAogICAgICAgIHZhcl9nIDwtIHZhcih5KSAtIHRhcmdldF9zZF4yCiAgICB9IGVsc2UgewogICAgICAgIHZhcl9nIDwtIHZhcl9nZW4odHlwZSwgY2MpCiAgICB9CiAgICByZXR1cm4oYyhnYWluX3JlcywgZ2Fpbl9yZXNfZmlsdGVyZWQsIHZhcl9nKSkKfQoKZ3JkIDwtIHBtYXAobGlzdCh0YXJnZXRfc2QsIHEsIHR5cGUsIGNjKSwgICAgICAgICAgICAgIyBSdW4gdGhlIHNpbXVsYXRpb25zIQogICAgICAgICAgICBnYWlueiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9uIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgbmJfcG9pbnRzID0gMTBeNSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgcG9pbnRzIHNpbXVsYXRlZDogMTBeNiBpbiB0aGUgcGFwZXIKcmVzIDwtIGdyZCAlPiUgdW5saXN0ICU+JSBtYXRyaXgobmNvbCA9IDMsIGJ5cm93ID0gVFJVRSkgICAgICAgICAgICAgICAgICAgIyBPcmdhbml6ZSByZXN1bHRzICgxKQpyZXMgPC0gZGF0YS5mcmFtZSh0eXBlID0gdHlwZSwgY2MgPSBjYywgcSA9IHEsIHRhcmdldF9zZCwgZ2FpbiA9IHJlc1ssMV0sICAjIE9yZ2FuaXplIHJlc3VsdHMgKDIpCiAgICAgICAgICAgICAgICAgIGdhaW5fZmlsdGVyZWQgPSByZXNbLDJdLCB2YXJfZyA9IHJlc1ssM10pCiMgc2F2ZShyZXMsIGZpbGUgPSAicmVzX2FnZy5SRGF0YSIpCmBgYAoKRmluYWxseSwgdGhlIHBsb3QuCgpgYGB7ciBwbG90c30KcmVzICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGdhaW4sIHkgPSBnYWluX2ZpbHRlcmVkLCBjb2xvciA9IHR5cGUpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbCgiTGVnZW5kIiwgdmFsdWVzID0gYygiI2ZmMDAwMCIsIiNmZjAwMDAiLCIjZmYwMDAwIiwiIzc4Nzg3OCIsIiMwMGNjZmYiLCIjOTkwMGNjIikpIApgYGAKClRoZSBpbXBvcnRhbnQgZmVhdHVyZSBpcyB0aGUgKipyZWQgZW52ZWxvcHBlKio6IGZvciBhIGdpdmVuIGluaXRpYWwgZ2FpbiwgdGhlIGJlc3QgaW1wcm92ZW1lbnQgaXMgb2J0YWluZWQgYnkgZ2VuZXJhdG9ycyB0aGF0IGFyZSBzdHJpY3RseSBpbmNyZWFzaW5nLgo=