diff options
| author | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2020-03-12 14:33:57 +0000 |
|---|---|---|
| committer | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2020-03-12 14:33:57 +0000 |
| commit | 7ef8f6e58990fc069cccc71ed6564e8c639ea4fc (patch) | |
| tree | 9e7662a34b7d0c1f1c5d9faf6d7d6ea8672f6410 /execs/R/cpdbench_changepointnp.R | |
| download | TCPDBench-7ef8f6e58990fc069cccc71ed6564e8c639ea4fc.tar.gz TCPDBench-7ef8f6e58990fc069cccc71ed6564e8c639ea4fc.zip | |
initial commit
Diffstat (limited to 'execs/R/cpdbench_changepointnp.R')
| -rw-r--r-- | execs/R/cpdbench_changepointnp.R | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/execs/R/cpdbench_changepointnp.R b/execs/R/cpdbench_changepointnp.R new file mode 100644 index 00000000..823e58a4 --- /dev/null +++ b/execs/R/cpdbench_changepointnp.R @@ -0,0 +1,102 @@ +#' --- +#' title: Wrapper for changepoint.np package in TCPDBench +#' author: G.J.J. van den Burg +#' date: 2019-09-30 +#' license: See LICENSE file. +#' copyright: 2019, The Alan Turing Institute +#' --- + +library(argparse) +library(changepoint.np) + +load.utils <- function() { + # get the name of the current script so we can load utils.R (yay, R!) + cmd.args <- commandArgs(trailingOnly=F) + file.arg <- "--file=" + this.script <- sub(file.arg, "", cmd.args[grep(file.arg, cmd.args)]) + this.dir <- dirname(this.script) + utils.script <- file.path(this.dir, 'utils.R') + source(utils.script) +} + +parse.args <- function() { + parser <- ArgumentParser(description='Wrapper for changepoint.np package') + parser$add_argument('-i', + '--input', + help='path to the input data file', + required=TRUE + ) + parser$add_argument('-o', + '--output', + help='path to the output file') + parser$add_argument('-p', + '--penalty', + choices=c( + 'None', + 'SIC', + 'BIC', + 'MBIC', + 'AIC', + 'Hannan-Quinn', + 'Asymptotic' + ), + help='Choice of penalty in the cpt function', + default='MBIC' + ) + parser$add_argument('-q', + '--nquantiles', + type='integer', + help='Number of quantiles to use', + default=10 + ) + return(parser$parse_args()) +} + +main <- function() { + args <- parse.args() + + # load the data + data <- load.dataset(args$input) + + # get the parameter list + defaults <- list(method='PELT', + test.stat='empirical_distribution', + minseglen=1) + params <- make.param.list(args, defaults) + + if (data$origina$n_dim > 1) { + # changepoint.np package can't handle multidimensional data + exit.error.multidim(data$original, args, params) + } + + vec <- as.vector(data$mat) + start.time <- Sys.time() + + result <- tryCatch({ + locs <- cpt.np(vec, + penalty=params$penalty, + method=params$method, + test.stat=params$test.stat, + minseglen=params$minseglen, + nquantiles=params$nquantiles, + class=FALSE + ) + list(locations=locs, error=NULL) + }, error=function(e) { + return(list(locations=NULL, error=e$message)) + }) + stop.time <- Sys.time() + runtime <- difftime(stop.time, start.time, units="secs") + + if (!is.null(result$error)) { + exit.with.error(data$original, args, params, result$error) + } + + # convert indices to 0-based indices + locations <- as.list(result$locations - 1) + + exit.success(data$original, args, params, locations, runtime) +} + +load.utils() +main() |
