https://github.com/cran/RandomFields
Raw File
Tip revision: d704bfb67fa3a6620ce3243713e915e7ca92622e authored by Martin Schlather on 17 September 2008, 00:00:00 UTC
version 1.3.35
Tip revision: d704bfb
getNset.R
#usermodel <- function(info, range, cov, derivative) {
#  ## hypermodels not allowed!
#  stopifnot(!is.null(info), !is.null(range), is.null(check))
#  .C("Init")
#  if (!is.null(cov))
#    .C("AddCov")
#  if (!is.null(derivative))
#    .C("AddTBM")
#}


paramextract <- function(p, model=c("cutoff")) {
  i <- .C("GetParamterPos", variance=integer(1), kappa=integer(1),
          lastkappa=integer(1), hyperinternal=integer(1),
          lasthyperinternal=integer(1), scale=integer(1), aniso=integer(1),
          hypernr=integer(1), localdiameter=integer(1), localr=integer(1),
          cutoffr=integer(1),
          hyperkappa=integer(1), total=integer(1), PACKAGE="RandomFields")
  i <- lapply(i, function(x) x + 1)
  model <- match.arg(model)
  return(switch(model,
                cutoff = list(hypernr=p[i$hypernr], diameter=p[i$localdiameter],
                  localr=p[i$localr], cutoffr=p[i$cutoffr])
                )
         )
}

CheckAndComplete <- function(model, param, dim) {
    p <- PrepareModel(model, param, dim)
    i <- .C("GetParamterPos", variance=integer(1), kappa=integer(1),
            lastkappa=integer(1), hyperinternal=integer(1),
            lasthyperinternal=integer(1), scale=integer(1), aniso=integer(1),
            hypernr=integer(1), localdiameter=integer(1), localr=integer(1),
            cutoffr=integer(1),
            hyperkappa=integer(1), total=integer(1), PACKAGE="RandomFields")
    error = integer(1)
    param = double(i$total * length(p$covnr))
    .C("CheckAndCompleteParameters",
       as.integer(p$covnr),
       as.double(p$param), 
       as.integer(length(p$param)), ## control
       as.integer(dim), 
       as.integer(length(p$covnr)),
       as.integer(p$anisotropy),
       as.integer(p$op),
       param,
       error,
       PACKAGE="RandomFields", DUP = FALSE)$res
    dim(param) = c(i$total, length(p$covnr))
    return(list(error=error, param=param))
}

GetRegisterInfo <- function(register=0, ignore.active=FALSE, max.elements=10^6)
  # ignore.active=TRUE only for internal debugging information!
  .Call("GetExtKeyInfo", as.integer(register), as.logical(ignore.active),
        as.integer(if (max.elements > .Machine$integer.max)
                   .Machine$integer.max else max.elements),
        PACKAGE="RandomFields")

GetModelInfo <- function(register=0)
  .Call("GetExtModelInfo", as.integer(register), PACKAGE="RandomFields")


GetPracticalRange <- function(model, kappas=NULL, dim=1) {
  covnr <-
    as.integer(.C("GetModelNr", as.character(model), as.integer(1),
                  nr = integer(1), PACKAGE="RandomFields")$nr)
  if (covnr < 0) {
    .C("PrintModelList", PACKAGE="RandomFields")
    stop("given model cannot be (uniquely) identified from the above list")
  }
  if (length(kappas) !=
      .C("GetNrParameters", covnr, as.integer(1), as.integer(dim),
         k = integer(1), PACKAGE="RandomFields")$k)
    stop("incorrect number of parameters!")
  nat.scl <- double(1)
  error <- integer(1)
  .C("GetNaturalScaling",
     as.integer(covnr),
     as.double(kappas),         ## not stable w.r.t. to changings !!
     as.integer(11),
     nat.scl,
     error,
     PACKAGE="RandomFields", DUP=FALSE)
  if (error) stop("natural scaling could not be obtained")
  return(1.0 / nat.scl)
}
#GetPracticalRange("whittle", 1)


GetMethodNames <- function() {
  assign(".p",
         .C("GetrfParameters", covmaxchar=integer(1), methodmaxchar=integer(1),
            distrmaxchar=integer(1),
            covnr=integer(1), methodnr=integer(1), distrnr=integer(1),
            maxdim=integer(1), maxmodels=integer(1),
            PACKAGE="RandomFields"))
  l <- character(.p$methodnr)
  for (i in 1:.p$methodnr) {
    l[i] <- .C("GetMethodName", as.integer(i-1),
               n=paste(rep(" ", .p$methodmaxchar), collapse=""),
               PACKAGE="RandomFields")$n
  }
  return(l)
}

GetDistributionNames <- function() {
  assign(".p",
         .C("GetrfParameters", covmaxchar=integer(1), methodmaxchar=integer(1),
            distrmaxchar=integer(1),
            covnr=integer(1), methodnr=integer(1), distrnr=integer(1),
            maxdim=integer(1), maxmodels=integer(1),
            PACKAGE="RandomFields"))
  l <- character(.p$distrnr)
  for (i in 1:.p$distrnr) {
    l[i] <- .C("GetDistrName", as.integer(i-1),
               n=paste(rep(" ",.p$distrmaxchar), collapse=""),
               PACKAGE="RandomFields")$n
  }
  return(l)
}


GetModelNames <- function() {
  assign(".p",
         .C("GetrfParameters", covmaxchar=integer(1), methodmaxchar=integer(1),
            distrmaxchar=integer(1),
            covnr=integer(1), methodnr=integer(1), distrnr=integer(1),
            maxdim=integer(1), maxmodels=integer(1),
            PACKAGE="RandomFields"))
  l <- character(.p$covnr)
  for (i in 1:.p$covnr) {
    l[i] <- .C("GetModelName",as.integer(i-1),
               n=paste(rep(" ",.p$covmaxchar), collapse=""),
               PACKAGE="RandomFields")$n
  }
  return(l)
}


GetModelList <- function(abbr=TRUE) {
  names <- GetModelNames()
  methods <- GetMethodNames()
  if (abbr) methods <- substr(methods, 1, if (is.logical(abbr)) 5 else abbr)
  idx <- integer(length(names) * length(methods))
  .C("GetModelList", idx, PACKAGE="RandomFields", DUP=FALSE)
  t(matrix(as.logical(idx), ncol=length(names), dimnames=list(methods, names)))
}

parampositions <- function(model, param, print=TRUE) {
  type <- if (!missing(param) && !is.null(param))
    if (is.matrix(param)) "n" else "s" else "l"
  old.model <- PrepareModel(model, param)
  model <- PrepareModel(convert.to.readable(old.model))
  if (length(old.model$param) != length(model$param))
    stop("The model should be simplified beforehand") 
  model$param <- 1:length(model$param)
  model$mean <- NA
  model <- convert.to.readable(model, allowed=type)
  model$method <-  model$trend <- NULL
  if (type=="l") {
    if (print) str(model)
  } else {
    if (print) cat("model:", model$model, "\nparam: ")
    if (type=="s") { # standard
      NUGGET <- 3
      if (is.finite(param[NUGGET]) && param[NUGGET]==0)
        model$param[NUGGET] <- NA
      if (print) cat(model$param, "\n")
    } else { # nested
      model$param[model$param==0] <- NA
      if (length(model$param) !=
          length(convert.to.readable(old.model, allow="n")$param))
        stop("Model is too complex to be identified")
      if (print) {
        cat("\n")
        print(model$param)
      }
    }
  }
  invisible(model)
}

"RFparameters" <- function (..., no.readonly=FALSE) {
  assign(".p",
         .C("GetrfParameters", covmaxchar=integer(1), methodmaxchar=integer(1),
            distrmaxchar=integer(1),
            covnr=integer(1), methodnr=integer(1), distrnr=integer(1),
            maxdim=integer(1), maxmodels=integer(1),
            PACKAGE="RandomFields"))
  assign(".methods", GetMethodNames())
  ## do not add any temporary variable til ## **
  ## do not remove leading "." from .maxdim
  Storing <- integer(1)
  PrintLevel <- integer(1)
  PracticalRange <- integer(1)
  ## always logical returned
  ## PracticalRange also allows for being set to
  ##  0 : no practical range
  ##  1,11 : practical range, evaluated exactly (if given in RFCovfct.cc)
  ##  2,12 : approximative value (if given in RFCovfct.cc)
  ##  3,13 : rough guess (good enough for MLE) (if given in RFCovfct.cc)
  ## >10: and if nothing appropriate given in RFCovfct.cc then numerical approx.
  pch <- as.character("  ")
  skipchecks <- integer(1)

  stationary.only <- integer(1)
  exactness <- integer(1)
  
  CE.force <- integer(1)
  CE.tolRe <- double(1)
  CE.tolIm <- double(1)
  CE.trials <- integer(1)
  CE.several <- integer(1)
  CE.strategy <- integer(1)
  CE.mmin <- double(.p$maxdim)
  CE.enlarge <- integer(1)
  CE.maxmem <- double(1)
  CE.useprimes <- integer(1)
  CE.dependent <- integer(1)
  
  local.force <- integer(1)
  local.tolRe <- double(1)
  local.tolIm <- double(1)
  local.several <- integer(1)
  local.mmin <- double(.p$maxdim)
  local.enlarge <- integer(1)
  local.maxmem <- double(1)
  local.useprimes <- integer(1)
  local.dependent <- integer(1)
 
  TBMCE.force <- integer(1)
  TBMCE.tolRe <- double(1)
  TBMCE.tolIm <- double(1)
  TBMCE.trials <- integer(1)
  TBMCE.strategy <- integer(1)
  TBMCE.mmin <- double(.p$maxdim)
  TBMCE.enlarge <- integer(1)
  TBMCE.maxmem <- double(1)
  TBMCE.useprimes <- integer(1)
  TBMCE.dependent <- integer(1)
  
  TBM.method <- integer(1)
  TBM.center <- double(.p$maxdim)
  TBM.points <- integer(1)

  TBM2.lines <- integer(1)
  TBM2.linesimufactor <- double(1)
  TBM2.linesimustep <- double(1)
  TBM2.every <- integer(1)
  TBM2.num <- integer(1)
  TBM2.layers <- integer(1)
  
  
  TBM3.lines <- integer(1)
  TBM3.linesimufactor <- double(1)
  TBM3.linesimustep <- double(1)
  TBM3.every <- integer(1)
  TBM3.layers <- integer(1)

  spectral.lines <- integer(1)
  spectral.grid <- integer(1)

  direct.method <- integer(1)
  direct.bestvariables <- integer(1)
  direct.maxvariables <- integer(1)
  direct.svdtolerance <- double(1)

  nugget.tol <- double(1)

  MPP.approxzero       <- double(1)
  add.MPP.realisations <- double(1)
  MPP.radius      <- double(1)

  hyper.superpos <- integer(1)
  hyper.maxlines <- integer(1)
  hyper.mar.distr <- integer(1)
  hyper.mar.param <- double(1)
 
  maxstable.maxGauss <- double(1)

  arg.list <- ls()
  ## ** 

  ## first element is the function name
  parameters <- list(...)
  for (m in 0:1) {
    # m = 0 reading parameters
    # m = 1 storing parameters
    storage.mode(m) <- "integer"
    ## "SetParam" more complicated since pch is of character type
    pch <- .Call("SetParamPch", m, pch);
    .C("SetParam", m, Storing, PrintLevel, PracticalRange, skipchecks,
            PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamDecision", m, stationary.only, exactness, 
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamCircEmbed", m, CE.force, CE.tolRe, CE.tolIm, CE.trials, 
       CE.several, CE.mmin, CE.useprimes, CE.strategy, CE.maxmem, CE.dependent,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamLocal", m, local.force, local.tolRe, local.tolIm,
       local.several,
       local.mmin, local.useprimes, local.maxmem,
       local.dependent,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamTBMCE", m, TBMCE.force, TBMCE.tolRe, TBMCE.tolIm, TBMCE.trials,
       TBMCE.mmin, TBMCE.useprimes, TBMCE.strategy, TBMCE.maxmem,
       TBMCE.dependent,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamTBM2", m, TBM2.lines, TBM2.linesimufactor,
       TBM2.linesimustep, TBM2.every, TBM2.num, TBM2.layers,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamTBM3", m, TBM3.lines, TBM3.linesimufactor,
       TBM3.linesimustep, TBM3.every, TBM3.layers,
       PACKAGE="RandomFields", DUP=FALSE)
   .C("SetParamTBM", m, TBM.method, TBM.center, TBM.points,
       PACKAGE="RandomFields", DUP=FALSE, NAOK=TRUE)
    .C("SetParamSpectral", m, spectral.lines, spectral.grid,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamDirectGauss", m, direct.method,
       direct.bestvariables, direct.maxvariables, direct.svdtolerance,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamNugget", m, nugget.tol,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetMPP", m, MPP.approxzero, add.MPP.realisations, MPP.radius,
       PACKAGE="RandomFields", DUP=FALSE)
    .C("SetParamHyperplane", m, hyper.superpos, hyper.maxlines,
       hyper.mar.distr, hyper.mar.param, NA.OK=TRUE, DUP=FALSE)
    .C("SetExtremes", m, maxstable.maxGauss, PACKAGE="RandomFields", DUP=FALSE)
    
    if (length(parameters)==0)
      return(c(list(
                    PracticalRange=if (PracticalRange<=1)
                    as.logical(PracticalRange) else PracticalRange, 
                    PrintLevel=PrintLevel,
                    pch=pch,
                    Storing=as.logical(Storing),
                    skipchecks = if (skipchecks<=1)
                                 as.logical(skipchecks) else skipchecks,
                    stationary.only = (if(stationary.only==-1) NA else
                                       as.logical(stationary.only)),
                    exactness = if(exactness==-1) NA else as.logical(exactness),
                    CE.force=as.logical(CE.force),
                    CE.mmin=CE.mmin,
                    CE.strategy=CE.strategy,
                    CE.maxmem=CE.maxmem,
                    CE.tolIm=CE.tolIm,
                    CE.tolRe=CE.tolRe,
                    CE.trials=CE.trials,
                    CE.several=as.logical(CE.several),
                    CE.useprimes=as.logical(CE.useprimes),
                    CE.dependent=as.logical(CE.dependent),
                    local.force=as.logical(local.force),
                    local.mmin=local.mmin,
                    local.maxmem=local.maxmem,
                    local.tolIm=local.tolIm,
                    local.tolRe=local.tolRe,
                    local.several=as.logical(local.several),
                    local.useprimes=as.logical(local.useprimes),
                    local.dependent=as.logical(local.dependent),
                    direct.bestvariables=direct.bestvariables,
                    direct.maxvariables=direct.maxvariables,
                    direct.svdtolerance=direct.svdtolerance,
                    direct.method=direct.method,
                    nugget.tol=nugget.tol,
                    spectral.grid=as.logical(spectral.grid),
                    spectral.lines=spectral.lines,
                    TBM.method=.methods[TBM.method+1],
                    TBM.center=TBM.center,
                    TBM.points=TBM.points,
                    TBM2.every=TBM2.every,
                    TBM2.lines=TBM2.lines,
                    TBM2.linesimufactor=TBM2.linesimufactor,
                    TBM2.linesimustep=TBM2.linesimustep,
                    TBM2.num=as.logical(TBM2.num),
                    TBM2.layers=if (TBM2.layers==0 || TBM2.layers==1)
                                   as.logical(TBM2.layers) else TBM2.layers,
                    TBM3.every=TBM3.every,
                    TBM3.lines=TBM3.lines,
                    TBM3.linesimufactor=TBM3.linesimufactor,
                    TBM3.linesimustep=TBM3.linesimustep,
                    TBM3.layers=if (TBM3.layers==0 || TBM3.layers==1)
                                  as.logical(TBM3.layers) else TBM3.layers,
                    TBMCE.force=as.logical(TBMCE.force),
                    TBMCE.mmin=TBMCE.mmin,
                    TBMCE.strategy=TBMCE.strategy,
                    TBMCE.maxmem = TBMCE.maxmem,
                    TBMCE.tolIm=TBMCE.tolIm,
                    TBMCE.tolRe=TBMCE.tolRe,
                    TBMCE.trials=TBMCE.trials,
                    TBMCE.useprimes=as.logical(TBMCE.useprimes),
                    TBMCE.dependent=as.logical(TBMCE.dependent),
                    add.MPP.realisations=add.MPP.realisations,
                    MPP.approxzero=MPP.approxzero,
                    MPP.radius=MPP.radius,
                    hyper.superpos=hyper.superpos,
                    hyper.maxlines=hyper.maxlines,
                    hyper.mar.distr=hyper.mar.distr,
                    hyper.mar.param=hyper.mar.param,
                    maxstable.maxGauss=maxstable.maxGauss
                    ),
               if (!no.readonly)
               list(
                    covmaxchar=.p$covmaxchar,
                    covnr=.p$covnr,
                    distrmaxchar=.p$distrmaxchar,
                    distrnr=.p$distrnr,
                    maxdim=.p$maxdim,
                    maxmodels=.p$maxmodels,
                    methodmaxchar=.p$methodmaxchar,
                    methodnr=.p$methodnr
                    )
               )
             )
    if (m==1) return(invisible(parameters))
    
    orig.name <- names(parameters)
    if (is.null(orig.name) || (orig.name[1]=="")) {
      txt <- "either a single unnamed list must be given or the parameters should be referenced by names"
      if ((length(parameters)!=1)) stop(txt)
      parameters <- parameters[[1]]
      orig.name <- names(parameters)
      if ((length(parameters) != sum(orig.name!="") ||
           (length(parameters)==0))) stop(txt)
    }

    name <- arg.list[pmatch(orig.name, arg.list)]
    if (any(is.na(name)))
      stop("the following parameter(s) could not be matched: ",
           paste(orig.name[is.na(name)], collapse=", "))
    names(parameters) <- name

    for (i in 1:length(parameters)) {
      type <- storage.mode(get(name[i]))
      ## parameters[i] is not sufficient since user give expression,
      ## which have type "language"
      v <- parameters[[i]]
      if (name[i]=="TBM.method") v <- pmatch(v, .methods) - 1
      if (name[i]=="stationary.only" && is.na(v)) v <- -1
      if (name[i]=="exactness" && is.na(v)) v <- -1
      if (switch(type,
                 character = !is.character(v),
                 integer = !is.finite(v) || (v != as.integer(v)),
                 double = !is.numeric(v)))
        stop(paste("`", orig.name[i], "' is not", type, sep=""))
      len <- length(get(name[i]))
      if (length(v) > len)
        stop(paste("`", orig.name[i], "' is a too long vector", sep=""))
      assign(name[i], rep(v, length=len))
      eval(parse(text=paste("storage.mode(",name[i],") <- type")))
    }
    stopifnot(PracticalRange %in% c(FALSE, TRUE, 2, 3, 11, 12, 13))
  }
}


"PrintModelList" <-function () {
    .C("PrintModelList", PACKAGE="RandomFields")
    invisible()
}


"PrintMethodList" <-function () {
    .C("PrintMethods", PACKAGE="RandomFields")
    invisible()
}


parameter.range <- function(model, dim){
  ## dim : space time dimension!
  if (length(model)==0) stop("model not given")
  stopifnot(is.character(model))
  nr <- .C("GetModelNr", as.character(model), as.integer(1), nr=integer(1),
           PACKAGE="RandomFields")$nr
  if (nr < 0) {
    .C("PrintModelList", PACKAGE="RandomFields")
    stop("given model cannot be (uniquely) identified from the above list")
  }
  storage.mode(nr) = "integer"
  storage.mode(dim) = "integer"
  l <- as.integer(4 * .C("GetNrParameters", nr, as.integer(1), dim,
                         k=integer(1), PACKAGE="RandomFields")$k)
  r <- list()
  r$theoretical <- list()
  r$practical <- list()
  index <- as.integer(1)

  while (index>0) {
    R <- double(l)
    index.orig <- index + 0 ## without + 0 index.orig points to index,
    ## what is a bug in R -- do report! -- Check if bug is still there
    .C("GetRange", nr, dim, index, R, l, PACKAGE="RandomFields", DUP=FALSE)
    R <- matrix(R, nrow=4)
    r$theoretical[[index.orig]] <- R[1:2, , drop=FALSE]
    r$practical[[index.orig]] <- R[3:4, , drop=FALSE]
  }
  if (index <= -2) {
    if (index==-2) r <- NaN ##  stop("dimension not correct")
    else stop(paste("error: inform maintainer (error nr.",index,")"))
  }
  return(if (is.list(r) && ncol(r$theoretical[[1]])==0) NULL else r)
}
back to top