• Thibault Hallouin's avatar
    refactor bindings to avoid copies of 1D arrays in evalp · d2a9450c
    Thibault Hallouin authored
    Since, by definition, `xt::pytensor` cannot be reshaped, and since
    `py::array` cannot be manipulated in an intermediate step on the C++
    side without compromising on it being accepted as an `xt::xexpression`
    type afterwards, the only viable option seemed to be to add a Python
    layer to the bindings so that the 1D numpy arrays can be reshaped into
    2D numpy array views before calling the C++ extension.
    
    As part of this refactoring, the default values for optional parameters
    are also removed, and the function parameter types are specified
    directly in the Python layer.
    d2a9450c
ErrorCrit_RMSE.R 1.13 KiB
ErrorCrit_RMSE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) {
  ## Arguments check
  if (!inherits(OutputsModel, "OutputsModel")) {
    stop("'OutputsModel' must be of class 'OutputsModel'")
  EC <- .ErrorCrit(InputsCrit = InputsCrit, Crit = "RMSE",  OutputsModel = OutputsModel, warnings = warnings)
  CritValue <- NA
  if (EC$CritCompute) {
    ## ErrorCrit
    Numer <- sum((EC$VarSim - EC$VarObs)^2, na.rm = TRUE)
    Denom <- sum(!is.na(EC$VarObs))
    if (Numer == 0) {
      Crit <- 0
    } else {
      Crit <- sqrt(Numer / Denom)
    if (is.numeric(Crit) & is.finite(Crit)) {
      CritValue <- Crit
    ## Verbose
    if (verbose) {
      message(sprintf("Crit. %s = %.4f", EC$CritName, CritValue))
  ## Output
  OutputsCrit <- list(CritValue       = CritValue,
                      CritName        = EC$CritName,
                      CritBestValue   = EC$CritBestValue,
                      Multiplier      = EC$Multiplier,
                      Ind_notcomputed = EC$Ind_TS_ignore)
  class(OutputsCrit) <- c("RMSE", "ErrorCrit")
  return(OutputsCrit)