R/np.plot.helpers.R

Defines functions trim.quantiles uocquantile .np_ksum_conditional_eval_exact .np_ksum_eval_exact_state .np_ksum_exact_state_build .np_con_make_kbandwidth_xy .np_con_make_kbandwidth_x .np_con_xregtype .np_con_inid_ksum_eligible .np_inid_boot_from_ksum_unconditional .np_inid_boot_from_ksum_unconditional_exact .np_inid_boot_from_hat_unconditional_frozen .np_plot_boot_from_frozen_operator .np_apply_operator_counts .np_ksum_unconditional_operator_fixed .np_operator_kernel_weight_scale .np_operator_matrix_from_ksum .np_unconditional_exact_precomputed_kband_safe .np_make_kbandwidth_unconditional .np_ksum_unconditional_eval_exact .np_boot_matrix_from_ksum .np_inid_boot_from_plreg .np_inid_boot_from_plreg_frozen .np_inid_boot_from_plreg_exact .np_plreg_weighted_coef .np_plreg_numeric_x_matrix .np_inid_boot_from_scoef .np_inid_boot_from_scoef_exact .np_inid_boot_from_scoef_localpoly_fixed .np_inid_boot_from_scoef_frozen .np_inid_scoef_predict_chunk .np_inid_scoef_predict_row .np_inid_scoef_numeric_y .np_inid_boot_from_index_exact .np_inid_boot_from_index_gradient_fixed .np_inid_boot_from_index_frozen .np_inid_boot_from_index .np_inid_boot_from_reghat_frozen .np_inid_boot_from_reghat_exact .np_inid_boot_from_regression .np_inid_boot_from_regression_localpoly_fixed .np_inid_boot_from_regression_localpoly_frozen .np_inid_lp_predict_chunk_multi .np_inid_lp_predict_row_multi .np_inid_lp_predict_chunk .np_inid_lp_predict_chunk_general .np_inid_lp_predict_row .np_inid_lp_unpack_sym_row .np_inid_lc_boot_from_hat .np_block_counts_drawer .np_active_boot_sample_matrix .np_active_boot_sample .np_bind_data_frames_fast .np_counts_to_indices .np_inid_counts_matrix .np_inid_chunk_size .np_plot_boot_factor_boxplots .np_plot_require_bws .np_plot_boot_from_hat_wild_factor_effects .np_plot_boot_from_hat_wild .np_plot_normalize_wild .np_plot_reject_wild_unsupervised .np_plot_is_wild_method .np_wild_boot_t .np_wild_chunk_size .np_rademacher_draws .np_mammen_draws .np_plot_scoef_bootstrap_target_label .np_plot_singleindex_bootstrap_target_label .np_plot_conditional_bootstrap_target_label .np_plot_regression_bootstrap_target_label compute.bootstrap.errors.sibandwidth compute.bootstrap.errors.condbandwidth compute.bootstrap.errors.conbandwidth compute.bootstrap.errors.dbandwidth compute.bootstrap.errors.bandwidth compute.bootstrap.errors.plbandwidth compute.bootstrap.errors.scbandwidth compute.bootstrap.errors.rbandwidth compute.bootstrap.errors .np_plot_normalize_common_options compute.default.error.range compute.all.error.range .np_plot_asymptotic_error_from_se .np_plot_bootstrap_col_sds .np_plot_bootstrap_interval_summary compute.bootstrap.quantile.bounds .np_plot_quantile_bounds_single .np_plot_quantile_bounds_multi .np_plot_quantile_type7_sorted np.plot.SCSrank .np_plot_conditional_eval .np_plot_quantile_eval .np_inid_boot_from_quantile_gradient_local .np_inid_boot_from_conditional_gradient_local .np_plot_unconditional_eval .np_plot_plreg_asymptotic_fit .np_plot_singleindex_asymptotic_eval .np_plot_singleindex_local_eval .np_plot_singleindex_hat_matrix_index .np_plot_singleindex_hat_apply_index .np_plot_singleindex_eval_grid .np_plot_validate_neval .np_plot_regression_eval .np_plot_resolve_xydat .np_plot_merge_override_args .np_plot_merge_user_args .np_plot_collect_rgl_args .np_plot_extract_prefixed_args .np_plot_user_args .np_plot_render_surface_rgl .np_plot_rgl_finalize .np_plot_validate_renderer_request .np_plot_rgl_surface_colors .np_plot_draw_error_wireframes_persp .np_plot_draw_wire_surface_persp .np_plot_project_wire_matrix_persp .np_plot_wireframe_templates_persp .np_plot_error_wire_alpha .np_plot_all_band_alpha .np_plot_all_band_colors .np_plot_persp_surface_colors .np_plot_theta_phi_label .np_plot_format_angle .np_plot_rotate_defaults .np_plot_rgl_view_angles .np_plot_match_renderer .np_plot_error_surfaces_rgl .np_plot_draw_box_grid_persp .np_plot_draw_floor_rug_rgl .np_plot_draw_floor_rug_persp .np_plot_draw_rug_1d .np_plot_validate_rug_request .np_plot_axis_is_continuous .np_plot_match_flag .np_plot_overlay_points_rgl .np_plot_overlay_points_persp .np_plot_overlay_points_factor .np_plot_overlay_points_1d .np_plot_overlay_range .np_plot_overlay_enabled .np_plot_panel_fun plotFactor draw.all.error.types draw.errors draw.error.bars draw.error.bands gen.tflabel gen.label .np_inid_boot_from_hat_conditional_frozen .np_inid_boot_from_ksum_conditional .np_inid_boot_from_ksum_conditional_exact .np_inid_boot_from_conditional_localpoly_fixed .np_inid_boot_from_conditional_localpoly_fixed_core .np_inid_boot_from_conditional_localpoly_fixed_chunk .np_inid_boot_from_conditional_localpoly_fixed_t0 .np_inid_boot_from_conditional_localpoly_fixed_group_features .np_inid_boot_from_conditional_localpoly_fixed_precompute .np_inid_boot_from_conditional_localpoly_fixed_counts .np_inid_boot_from_conditional_localpoly_fixed_rowwise .np_plot_exact_row_groups .np_ksum_conditional_operator_fixed .np_conditional_exact_fit_or_stop .np_plot_progress_target_label .np_plot_progress_target_name .np_plot_bootstrap_stage_label .np_plot_bootstrap_plan_unconditional_density .np_plot_bootstrap_phase_labels .np_plot_unconditional_eval_size .np_plot_unconditional_surface_eligible .np_plot_bootstrap_target_names .np_plot_layout_activate .np_plot_layout_begin .np_plot_interval_payload .np_plot_engine_begin .np_plot_scalar_default .np_plot_restore_par .np_plot_capture_par .np_plot_rotation_progress_end .np_plot_rotation_progress_tick .np_plot_rotation_progress_begin .np_plot_first_render_end .np_plot_first_render_begin .np_plot_first_render_state .np_plot_activity_run .np_plot_activity_end .np_plot_activity_begin .np_plot_stage_progress_begin .np_plot_progress_end .np_plot_progress_tick .np_plot_bootstrap_progress_begin .np_plot_progress_begin .np_plot_progress_checkpoints .np_plot_progress_chunk_observe .np_plot_progress_chunk_controller .np_plot_progress_warmup_chunk .np_plot_progress_warmup_max_reps .np_plot_progress_chunk_cap .np_plot_progress_max_intermediate .np_plot_progress_start_grace_sec .np_plot_progress_interval_sec .np_plot_progress_enabled .np_with_seed .np_seed_exit .np_seed_enter

Documented in uocquantile

## the idea is that you have done bandwidth selection
## you just need to supply training data and the bandwidth
## this tool will help you visualize the result

.np_seed_enter <- function(random.seed = 42L) {
  save.seed <- NULL
  if (exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) {
    save.seed <- get(".Random.seed", envir = .GlobalEnv, inherits = FALSE)
    exists.seed <- TRUE
  } else {
    exists.seed <- FALSE
  }

  set.seed(random.seed)
  list(exists.seed = exists.seed, save.seed = save.seed)
}

.np_seed_exit <- function(state, remove_if_absent = FALSE) {
  if (isTRUE(state$exists.seed)) {
    assign(".Random.seed", state$save.seed, envir = .GlobalEnv)
  } else if (isTRUE(remove_if_absent) &&
             exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) {
    rm(".Random.seed", envir = .GlobalEnv)
  }
  invisible(NULL)
}

.np_with_seed <- function(random.seed = 42L, code) {
  seed.state <- .np_seed_enter(random.seed)
  on.exit(.np_seed_exit(seed.state), add = TRUE)
  force(code)
}

.np_plot_progress_enabled <- function() {
  isTRUE(getOption("np.messages", TRUE)) &&
    isTRUE(getOption("np.plot.progress", TRUE)) &&
    isTRUE(.np_progress_is_interactive())
}

.np_plot_progress_interval_sec <- function() {
  .np_progress_interval_sec(known_total = FALSE, domain = "plot")
}

.np_plot_progress_start_grace_sec <- function() {
  .np_progress_start_grace_sec(known_total = TRUE, domain = "plot")
}

.np_plot_progress_max_intermediate <- function() {
  val <- suppressWarnings(as.integer(getOption("np.plot.progress.max.intermediate", 3L))[1L])
  if (is.na(val) || val < 0L)
    val <- 3L
  val
}

.np_plot_progress_chunk_cap <- function(total) {
  total <- as.integer(total)
  if (is.na(total) || total < 1L)
    return(1L)

  max_intermediate <- .np_plot_progress_max_intermediate()
  if (is.na(max_intermediate) || max_intermediate < 1L)
    return(total)

  max(1L, as.integer(ceiling(total / (max_intermediate + 1L))))
}

.np_plot_progress_warmup_max_reps <- function() {
  val <- suppressWarnings(as.integer(getOption("np.plot.progress.warmup.max.reps", 16L))[1L])
  if (is.na(val) || val < 1L)
    val <- 16L
  val
}

.np_plot_progress_warmup_chunk <- function(n, B, chunk.size,
                                           progress_enabled = .np_plot_progress_enabled()) {
  n <- as.integer(n)[1L]
  B <- as.integer(B)[1L]
  chunk.size <- as.integer(chunk.size)[1L]
  if (is.na(n) || n < 1L || is.na(B) || B < 1L || is.na(chunk.size) || chunk.size < 1L)
    return(1L)
  if (!isTRUE(progress_enabled))
    return(min(B, chunk.size))

  warmup.bytes <- 4 * 1024 * 1024
  warmup.chunk <- as.integer(floor(warmup.bytes / (8 * n)))
  if (!is.finite(warmup.chunk) || is.na(warmup.chunk) || warmup.chunk < 1L)
    warmup.chunk <- 1L
  warmup.chunk <- min(warmup.chunk, .np_plot_progress_warmup_max_reps())

  min(B, chunk.size, warmup.chunk)
}

.np_plot_progress_chunk_controller <- function(chunk.size, progress = NULL) {
  chunk.size <- as.integer(chunk.size)[1L]
  if (is.na(chunk.size) || chunk.size < 1L)
    chunk.size <- 1L

  target.sec <- if (!is.null(progress)) {
    suppressWarnings(as.numeric(progress$throttle_sec)[1L])
  } else {
    NA_real_
  }

  list(
    chunk.size = chunk.size,
    adaptive = isTRUE(.np_plot_progress_enabled()) &&
      !is.null(progress) &&
      is.finite(target.sec) &&
      !is.na(target.sec) &&
      target.sec > 0,
    target.sec = target.sec
  )
}

.np_plot_progress_chunk_observe <- function(controller, bsz, elapsed.sec) {
  if (is.null(controller) || !isTRUE(controller$adaptive))
    return(controller)

  bsz <- as.integer(bsz)[1L]
  elapsed.sec <- suppressWarnings(as.numeric(elapsed.sec)[1L])
  target.sec <- suppressWarnings(as.numeric(controller$target.sec)[1L])
  if (is.na(bsz) || bsz < 1L || !is.finite(elapsed.sec) || is.na(elapsed.sec) || elapsed.sec <= 0)
    return(controller)
  if (!is.finite(target.sec) || is.na(target.sec) || target.sec <= 0)
    return(controller)

  suggested <- as.integer(round(bsz * target.sec / elapsed.sec))
  lower <- max(1L, as.integer(floor(bsz / 4L)))
  upper <- max(lower, as.integer(ceiling(bsz * 4L)))
  if (is.na(suggested) || suggested < 1L)
    suggested <- lower

  controller$chunk.size <- min(upper, max(lower, suggested))
  controller
}

.np_plot_progress_checkpoints <- function(total) {
  total <- as.integer(total)
  max_intermediate <- .np_plot_progress_max_intermediate()
  if (is.na(total) || total < 2L || max_intermediate < 1L)
    return(integer())

  checkpoints <- unique(as.integer(ceiling(total * seq_len(max_intermediate) / (max_intermediate + 1L))))
  checkpoints[checkpoints >= 1L & checkpoints < total]
}

.np_plot_progress_begin <- function(total, label) {
  total <- as.integer(total)
  if (is.na(total) || total < 1L || !.np_plot_progress_enabled())
    return(NULL)

  label <- as.character(label)[1L]
  state <- .np_progress_begin(label = label, total = total, domain = "plot", surface = "plot_bounded")
  state$enabled <- isTRUE(.np_plot_progress_enabled())
  state$throttle_sec <- .np_plot_progress_interval_sec()
  state$last_emit <- state$started - state$throttle_sec
  state$start_note_grace_sec <- .np_plot_progress_start_grace_sec()
  state$start_note_consumes_throttle <- TRUE
  state$checkpoints <- .np_plot_progress_checkpoints(total = total)
  state$next_checkpoint_idx <- 1L
  state
}

.np_plot_bootstrap_progress_begin <- function(total, label) {
  state <- .np_plot_progress_begin(total = total, label = label)
  if (is.null(state))
    return(NULL)

  .np_progress_show_now(state = state, done = 0L)
}

.np_plot_progress_tick <- function(state, done, force = FALSE) {
  if (is.null(state))
    return(state)

  done <- as.integer(done)
  if (is.na(done))
    done <- 0L
  done <- max(0L, min(state$total, done))

  state$last_done <- done
  now <- .np_progress_now()
  state <- .np_progress_maybe_emit_start_note(state = state, now = now)

  if (!isTRUE(force)) {
    checkpoints <- state$checkpoints
    next_idx <- state$next_checkpoint_idx
    reached_checkpoint <- FALSE
    if (length(checkpoints) && !is.na(next_idx) && next_idx <= length(checkpoints)) {
      next_checkpoint <- checkpoints[[next_idx]]
      if (done >= next_checkpoint) {
        reached <- max(which(checkpoints <= done))
        state$next_checkpoint_idx <- as.integer(reached + 1L)
        reached_checkpoint <- TRUE
      }
    }

    emitted_done <- if (is.null(state$last_emitted_done)) 0L else as.integer(state$last_emitted_done)
    advanced <- isTRUE(done > emitted_done)
    time_ready <- isTRUE(advanced) &&
      !isTRUE(state$start_note_pending) &&
      ((now - state$last_emit) >= state$throttle_sec)

    if (!isTRUE(reached_checkpoint) && !isTRUE(time_ready)) {
      return(state)
    }
  }

  if (isTRUE(force))
    state$last_emit <- -Inf

  .np_progress_step(state = state, done = done)
}

.np_plot_progress_end <- function(state) {
  if (is.null(state))
    return(invisible(NULL))

  .np_progress_end(state)
  invisible(NULL)
}

.np_plot_stage_progress_begin <- function(total, label) {
  state <- .np_plot_progress_begin(total = total, label = label)
  if (is.null(state))
    return(NULL)

  .np_progress_show_now(state = state, done = 0L)
}

.np_plot_activity_begin <- function(label) {
  if (!.np_plot_progress_enabled())
    return(NULL)

  label <- as.character(label)[1L]
  state <- .np_progress_begin(label = label, domain = "plot", surface = "plot_activity")
  state$enabled <- isTRUE(.np_plot_progress_enabled())
  state$throttle_sec <- Inf
  state$last_emit <- state$started - state$throttle_sec
  state$start_note_grace_sec <- .np_plot_progress_start_grace_sec()
  state <- .np_progress_show_now(state = state)
  .np_progress_release_owner(state$id)
  state
}

.np_plot_activity_end <- function(state) {
  if (is.null(state))
    return(invisible(NULL))

  state <- .np_progress_maybe_emit_start_note(state = state, now = .np_progress_now())
  .np_progress_end(state)
  invisible(NULL)
}

.np_plot_activity_run <- function(label, expr) {
  activity <- .np_plot_activity_begin(label)
  on.exit(.np_plot_activity_end(activity), add = TRUE)
  force(expr)
}

.np_plot_first_render_state <- function() {
  state <- new.env(parent = emptyenv())
  state$activity <- NULL
  state$pending <- TRUE
  state
}

.np_plot_first_render_begin <- function(state, label = "Rendering plot surface") {
  if (is.null(state) || !isTRUE(state$pending))
    return(invisible(NULL))

  state$activity <- .np_plot_activity_begin(label)
  invisible(NULL)
}

.np_plot_first_render_end <- function(state) {
  if (is.null(state) || !isTRUE(state$pending))
    return(invisible(NULL))

  .np_plot_activity_end(state$activity)
  state$activity <- NULL
  state$pending <- FALSE
  invisible(NULL)
}

.np_plot_rotation_progress_begin <- function(total_frames, label = "Rotating plot") {
  total_frames <- as.integer(total_frames)[1L]
  if (is.na(total_frames) || total_frames < 2L)
    return(NULL)

  .np_plot_progress_begin(total = total_frames, label = label)
}

.np_plot_rotation_progress_tick <- function(state, done) {
  .np_plot_progress_tick(state = state, done = done)
}

.np_plot_rotation_progress_end <- function(state) {
  .np_plot_progress_end(state)
}

.np_plot_capture_par <- function(names = character()) {
  names <- unique(as.character(names))
  if (!length(names))
    return(list())
  if (isTRUE(unname(as.integer(dev.cur())) == 1L))
    return(list())
  par(names)
}

.np_plot_restore_par <- function(oldpar, reset.new = TRUE) {
  if (isTRUE(reset.new))
    suppressWarnings(try(par(new = FALSE), silent = TRUE))
  if (!is.null(oldpar) && length(oldpar))
    suppressWarnings(try(par(oldpar), silent = TRUE))
  invisible(NULL)
}

.np_plot_scalar_default <- function(value, default) {
  if (is.null(value)) default else value
}

.np_plot_engine_begin <- function(plot.par.mfrow = TRUE) {
  plot.par.mfrow.opt <- getOption("plot.par.mfrow")
  if (!is.null(plot.par.mfrow.opt))
    plot.par.mfrow <- plot.par.mfrow.opt

  oldpar.names <- "cex"
  if (isTRUE(plot.par.mfrow))
    oldpar.names <- c("mfrow", oldpar.names)

  list(
    oldpar = .np_plot_capture_par(oldpar.names),
    plot.par.mfrow = plot.par.mfrow
  )
}

.np_plot_interval_payload <- function(estimate,
                                      se,
                                      plot.errors.method,
                                      plot.errors.alpha,
                                      plot.errors.type,
                                      plot.errors.center,
                                      bootstrap_raw = NULL) {
  err <- matrix(data = se, nrow = length(estimate), ncol = 3)
  err[,3] <- NA_real_
  all.err <- NULL
  center <- estimate
  bxp <- list()

  if (identical(plot.errors.method, "bootstrap")) {
    if (is.null(bootstrap_raw))
      stop("bootstrap interval payload requires bootstrap_raw")

    err <- bootstrap_raw[["boot.err"]]
    all.err <- bootstrap_raw[["boot.all.err"]]
    center <- if (identical(plot.errors.center, "bias-corrected")) err[,3] else estimate
    bxp <- bootstrap_raw[["bxp"]]
  } else if (identical(plot.errors.method, "asymptotic")) {
    asym.obj <- .np_plot_asymptotic_error_from_se(
      se = se,
      alpha = plot.errors.alpha,
      band.type = plot.errors.type,
      m = length(estimate)
    )
    err[,1:2] <- asym.obj$err
    all.err <- asym.obj$all.err
  }

  list(
    err = err,
    all.err = all.err,
    center = center,
    bxp = bxp
  )
}

.np_plot_layout_begin <- function(plot.behavior, plot.par.mfrow, mfrow) {
  list(
    pending = isTRUE(plot.behavior != "data" && plot.par.mfrow),
    mfrow = mfrow
  )
}

.np_plot_layout_activate <- function(state) {
  if (is.null(state) || !isTRUE(state$pending)) {
    return(state)
  }

  par(mfrow = state$mfrow, cex = par()$cex)
  state$pending <- FALSE
  state
}

.np_plot_bootstrap_target_names <- function(xdat, names_hint = NULL, prefix = "x") {
  if (!is.null(xdat)) {
    xnames <- names(xdat)
  } else {
    xnames <- NULL
  }

  if (is.null(xnames) || !length(xnames)) {
    xnames <- names_hint
  }

  if (is.null(xnames))
    xnames <- character()

  xnames <- as.character(xnames)
  missing.idx <- !nzchar(xnames)
  if (any(missing.idx))
    xnames[missing.idx] <- paste0(prefix, which(missing.idx))
  xnames
}

.np_plot_unconditional_surface_eligible <- function(bws, perspective) {
  isTRUE(perspective) &&
    isTRUE((bws$ncon + bws$nord) == 2L) &&
    isTRUE(bws$nuno == 0L) &&
    !any(xor(bws$xdati$iord, bws$xdati$inumord))
}

.np_plot_unconditional_eval_size <- function(x, neval) {
  if (is.factor(x) || is.ordered(x))
    return(length(levels(x)))

  as.integer(neval)[1L]
}

.np_plot_bootstrap_phase_labels <- function(plot.errors.type) {
  band.type <- as.character(plot.errors.type)[1L]
  c(
    preparing = "preparing",
    bootstrap = "bootstrapping",
    constructing = sprintf("constructing %s bands", band.type)
  )
}

.np_plot_bootstrap_plan_unconditional_density <- function(bws,
                                                          xdat,
                                                          neval,
                                                          perspective,
                                                          plot.errors.boot.method,
                                                          plot.errors.type) {
  xdat <- toFrame(xdat)
  neval <- as.integer(neval)[1L]
  if (is.na(neval) || neval < 1L)
    stop("'neval' must be a positive integer", call. = FALSE)

  xnames <- .np_plot_bootstrap_target_names(
    xdat = xdat,
    names_hint = bws$xnames,
    prefix = "x"
  )

  if (.np_plot_unconditional_surface_eligible(bws = bws, perspective = perspective)) {
    x1.size <- .np_plot_unconditional_eval_size(xdat[[1L]], neval)
    x2.size <- .np_plot_unconditional_eval_size(xdat[[2L]], neval)
    targets <- list(list(
      index = 1L,
      kind = "surface",
      label = sprintf("%s,%s surface", xnames[[1L]], xnames[[2L]]),
      eval_size = as.integer(x1.size * x2.size)
    ))
  } else {
    targets <- lapply(seq_len(bws$ndim), function(i) {
      list(
        index = as.integer(i),
        kind = "slice",
        label = xnames[[i]],
        eval_size = .np_plot_unconditional_eval_size(xdat[[i]], neval)
      )
    })
  }

  list(
    family = "unconditional_density",
    method_label = as.character(plot.errors.boot.method)[1L],
    band_type = as.character(plot.errors.type)[1L],
    phase_labels = .np_plot_bootstrap_phase_labels(plot.errors.type),
    target_total = length(targets),
    targets = targets
  )
}

.np_plot_bootstrap_stage_label <- function(stage,
                                           method_label = NULL,
                                           target_label = NULL) {
  stage <- as.character(stage)[1L]
  method_label <- if (is.null(method_label)) NULL else as.character(method_label)[1L]
  target_label <- if (is.null(target_label)) NULL else as.character(target_label)[1L]

  base <- if (!is.null(method_label) && nzchar(method_label)) {
    sprintf("%s %s", stage, method_label)
  } else {
    stage
  }

  if (!is.null(target_label) && nzchar(target_label)) {
    sprintf("%s (%s)", base, target_label)
  } else {
    base
  }
}

.np_plot_progress_target_name <- function(name, fallback) {
  name <- if (is.null(name)) NULL else as.character(name)[1L]
  if (is.null(name) || !nzchar(name) || is.na(name)) {
    fallback
  } else {
    name
  }
}

.np_plot_progress_target_label <- function(target_name = NULL,
                                           index = 1L,
                                           total = 1L) {
  index <- suppressWarnings(as.integer(index)[1L])
  total <- suppressWarnings(as.integer(total)[1L])
  target_name <- if (is.null(target_name)) NULL else as.character(target_name)[1L]

  if (is.na(total) || total < 1L)
    total <- 1L
  if (is.na(index) || index < 1L)
    index <- 1L

  if (total <= 1L)
    return(NULL)

  if (!is.null(target_name) && nzchar(target_name) && !is.na(target_name)) {
    sprintf("%s %d/%d", target_name, index, total)
  } else {
    sprintf("surf %d/%d", index, total)
  }
}

.np_plot_regression_bootstrap_target_label <- function(bws,
                                                       slice.index,
                                                       gradients = FALSE) {
  slice.index <- suppressWarnings(as.integer(slice.index)[1L])
  total <- suppressWarnings(as.integer(bws$ndim)[1L])
  if (is.na(total) || total < 1L) {
    total <- 1L
  }

  if (is.na(slice.index) || slice.index <= 0L) {
    return(.np_plot_progress_target_label(index = 1L, total = total))
  }

  target_name <- .np_plot_progress_target_name(
    if (!is.null(bws$xnames) && length(bws$xnames) >= slice.index) bws$xnames[[slice.index]] else NULL,
    sprintf("x%d", slice.index)
  )
  if (isTRUE(gradients)) {
    target_name <- sprintf("grad %s", target_name)
  }

  .np_plot_progress_target_label(target_name = target_name,
                                 index = slice.index,
                                 total = total)
}

.np_plot_conditional_bootstrap_target_label <- function(bws,
                                                        slice.index,
                                                        gradients = FALSE,
                                                        gradient.index = 0L) {
  slice.index <- suppressWarnings(as.integer(slice.index)[1L])
  gradient.index <- suppressWarnings(as.integer(gradient.index)[1L])
  x_total <- suppressWarnings(as.integer(bws$xndim)[1L])
  y_total <- suppressWarnings(as.integer(bws$yndim)[1L])
  if (is.na(x_total) || x_total < 0L) x_total <- 0L
  if (is.na(y_total) || y_total < 0L) y_total <- 0L
  total <- max(1L, x_total + y_total)

  if (is.na(slice.index) || slice.index <= 0L) {
    return(.np_plot_progress_target_label(index = 1L, total = total))
  }

  if (slice.index <= x_total) {
    target_name <- .np_plot_progress_target_name(
      if (!is.null(bws$xnames) && length(bws$xnames) >= slice.index) bws$xnames[[slice.index]] else NULL,
      sprintf("x%d", slice.index)
    )
  } else {
    y_index <- slice.index - x_total
    target_name <- .np_plot_progress_target_name(
      if (!is.null(bws$ynames) && length(bws$ynames) >= y_index) bws$ynames[[y_index]] else NULL,
      sprintf("y%d", y_index)
    )
  }

  if (isTRUE(gradients) && !is.na(gradient.index) && gradient.index > 0L) {
    grad_name <- .np_plot_progress_target_name(
      if (!is.null(bws$xnames) && length(bws$xnames) >= gradient.index) bws$xnames[[gradient.index]] else NULL,
      sprintf("x%d", gradient.index)
    )
    target_name <- sprintf("grad %s on %s", grad_name, target_name)
  }

  .np_plot_progress_target_label(target_name = target_name,
                                 index = slice.index,
                                 total = total)
}

.np_plot_singleindex_bootstrap_target_label <- function(gradients = FALSE) {
  .np_plot_progress_target_label(
    target_name = if (isTRUE(gradients)) "grad index" else "index",
    index = 1L,
    total = 1L
  )
}

.np_plot_scoef_bootstrap_target_label <- function(bws, slice.index) {
  slice.index <- suppressWarnings(as.integer(slice.index)[1L])
  x_total <- suppressWarnings(as.integer(bws$xndim)[1L])
  z_total <- suppressWarnings(as.integer(bws$zndim)[1L])
  if (is.na(x_total) || x_total < 0L) x_total <- 0L
  if (is.na(z_total) || z_total < 0L) z_total <- 0L
  total <- max(1L, x_total + z_total)

  if (is.na(slice.index) || slice.index <= 0L) {
    return(.np_plot_progress_target_label(index = 1L, total = total))
  }

  if (slice.index <= x_total) {
    target_name <- .np_plot_progress_target_name(
      if (!is.null(bws$xnames) && length(bws$xnames) >= slice.index) bws$xnames[[slice.index]] else NULL,
      sprintf("x%d", slice.index)
    )
  } else {
    z_index <- slice.index - x_total
    target_name <- .np_plot_progress_target_name(
      if (!is.null(bws$znames) && length(bws$znames) >= z_index) bws$znames[[z_index]] else NULL,
      sprintf("z%d", z_index)
    )
  }

  .np_plot_progress_target_label(target_name = target_name,
                                 index = slice.index,
                                 total = total)
}

.np_mammen_draws <- function(n, B) {
  a <- (1 - sqrt(5)) / 2
  p.a <- (sqrt(5) + 1) / (2 * sqrt(5))
  u <- matrix(stats::runif(n * B), nrow = n, ncol = B)
  out <- matrix(1 - a, nrow = n, ncol = B)
  out[u <= p.a] <- a
  out
}

.np_rademacher_draws <- function(n, B) {
  u <- matrix(stats::runif(n * B), nrow = n, ncol = B)
  out <- matrix(1.0, nrow = n, ncol = B)
  out[u <= 0.5] <- -1.0
  out
}

.np_wild_chunk_size <- function(n, B,
                                progress_enabled = .np_plot_progress_enabled()) {
  chunk.opt <- getOption("np.plot.wild.chunk.size")
  if (!is.null(chunk.opt)) {
    chunk.opt <- as.integer(chunk.opt)
    if (length(chunk.opt) != 1L || is.na(chunk.opt) || chunk.opt < 1L)
      stop("option 'np.plot.wild.chunk.size' must be a positive integer")
    return(min(B, chunk.opt))
  }

  if (n < 1L || B < 1L)
    return(1L)

  # Keep the temporary n x chunk response matrix in a moderate memory range.
  target.bytes <- 64 * 1024 * 1024
  chunk <- as.integer(floor(target.bytes / (8 * n)))
  if (!is.finite(chunk) || is.na(chunk) || chunk < 1L)
    chunk <- 1L
  if (isTRUE(progress_enabled))
    chunk <- min(B, chunk, .np_plot_progress_chunk_cap(B))
  .np_plot_progress_warmup_chunk(
    n = n,
    B = B,
    chunk.size = chunk,
    progress_enabled = progress_enabled
  )
}

.np_wild_boot_t <- function(H,
                            fit.mean,
                            residuals,
                            B,
                            wild = c("mammen", "rademacher"),
                            progress.label = "Plot bootstrap wild") {
  B <- as.integer(B)
  n <- length(residuals)
  if (length(fit.mean) != n)
    stop("length mismatch between fitted means and residuals for wild bootstrap")
  if (B < 1L)
    stop("argument 'plot.errors.boot.num' must be a positive integer")

  chunk.size <- .np_wild_chunk_size(n = n, B = B)
  out <- matrix(NA_real_, nrow = B, ncol = nrow(H))
  fit.mean <- as.double(fit.mean)
  residuals <- as.double(residuals)
  wild <- .np_plot_normalize_wild(wild)
  draw.fun <- if (identical(wild, "mammen")) .np_mammen_draws else .np_rademacher_draws
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)

  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    draws <- draw.fun(n = n, B = bsz)
    ystar <- residuals * draws
    ystar <- ystar + fit.mean
    out[start:stopi, ] <- t(H %*% ystar)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  out
}

.np_plot_is_wild_method <- function(method) {
  isTRUE(length(method) == 1L && !is.na(method) && method == "wild")
}

.np_plot_reject_wild_unsupervised <- function(method, where) {
  if (.np_plot_is_wild_method(method)) {
    stop(sprintf("plot.errors.boot.method='wild' is not supported for %s; use one of 'inid', 'fixed', or 'geom'", where))
  }
  invisible(NULL)
}

.np_plot_normalize_wild <- function(wild = c("rademacher", "mammen")) {
  if (length(wild) > 1L)
    wild <- wild[1L]
  match.arg(wild, c("mammen", "rademacher"))
}

.np_plot_boot_from_hat_wild <- function(H,
                                        ydat,
                                        fit.mean,
                                        B,
                                        wild,
                                        progress.label = "Plot bootstrap wild") {
  fit.mean <- as.vector(fit.mean)
  list(
    t = .np_wild_boot_t(
      H = H,
      fit.mean = fit.mean,
      residuals = as.double(ydat - fit.mean),
      B = as.integer(B),
      wild = wild,
      progress.label = progress.label
    ),
    t0 = as.vector(H %*% as.double(ydat))
  )
}

.np_plot_boot_from_hat_wild_factor_effects <- function(H,
                                                       ydat,
                                                       fit.mean,
                                                       B,
                                                       wild,
                                                       progress.label = "Plot bootstrap wild") {
  out <- .np_plot_boot_from_hat_wild(
    H = H,
    ydat = ydat,
    fit.mean = fit.mean,
    B = B,
    wild = wild,
    progress.label = progress.label
  )
  if (ncol(out$t) < 1L)
    return(out)
  out$t <- sweep(out$t, 1L, out$t[, 1L], "-", check.margin = FALSE)
  out$t0 <- out$t0 - out$t0[1L]
  out
}

.np_plot_require_bws <- function(bws, where) {
  if (is.null(bws))
    stop(sprintf("required argument 'bws' is missing or NULL in %s", where))
  invisible(TRUE)
}

.np_plot_boot_factor_boxplots <- function(boot.t, tdati, ti, B) {
  all.bp <- list()
  ti <- as.integer(ti)[1L]
  if (is.na(ti) || ti < 1L)
    return(all.bp)
  if (ti > length(tdati$iord) || ti > length(tdati$iuno))
    return(all.bp)
  if (!(isTRUE(tdati$iord[ti]) || isTRUE(tdati$iuno[ti])))
    return(all.bp)

  boot.frame <- as.data.frame(boot.t)
  u.lev <- tdati$all.ulev[[ti]]
  stopifnot(length(u.lev) == ncol(boot.frame))

  all.bp$stats <- matrix(data = NA, nrow = 5, ncol = length(u.lev))
  all.bp$conf <- matrix(data = NA, nrow = 2, ncol = length(u.lev))

  for (i in seq_along(u.lev)) {
    t.bp <- boxplot.stats(boot.frame[, i])
    all.bp$stats[, i] <- t.bp$stats
    all.bp$conf[, i] <- t.bp$conf
    all.bp$out <- c(all.bp$out, t.bp$out)
    all.bp$group <- c(all.bp$group, rep.int(i, length(t.bp$out)))
  }

  all.bp$n <- rep.int(as.integer(B), length(u.lev))
  all.bp$names <- tdati$all.lev[[ti]]
  all.bp
}

.np_inid_chunk_size <- function(n, B, progress_cap = FALSE,
                                progress_enabled = .np_plot_progress_enabled()) {
  chunk.opt <- getOption("np.plot.inid.chunk.size")
  if (!is.null(chunk.opt)) {
    chunk.opt <- as.integer(chunk.opt)
    if (length(chunk.opt) != 1L || is.na(chunk.opt) || chunk.opt < 1L)
      stop("option 'np.plot.inid.chunk.size' must be a positive integer")
    return(min(B, chunk.opt))
  }

  if (n < 1L || B < 1L)
    return(1L)

  target.bytes <- 64 * 1024 * 1024
  chunk <- as.integer(floor(target.bytes / (8 * n)))
  if (!is.finite(chunk) || is.na(chunk) || chunk < 1L)
    chunk <- 1L
  if (isTRUE(progress_enabled))
    chunk <- min(chunk, .np_plot_progress_chunk_cap(B))
  if (isTRUE(progress_enabled) || isTRUE(progress_cap))
    chunk <- .np_plot_progress_warmup_chunk(
      n = n,
      B = B,
      chunk.size = chunk,
      progress_enabled = progress_enabled
    )
  min(B, chunk)
}

.np_inid_counts_matrix <- function(n, B, counts = NULL) {
  n <- as.integer(n)
  B <- as.integer(B)
  if (n < 1L || B < 1L)
    stop("invalid inid bootstrap dimensions")

  if (!is.null(counts)) {
    counts <- as.matrix(counts)
    if (!is.numeric(counts) ||
        nrow(counts) != n ||
        ncol(counts) != B)
      stop("counts must be an n x B numeric matrix")
    return(counts)
  }

  stats::rmultinom(n = B, size = n, prob = rep.int(1 / n, n))
}

.np_counts_to_indices <- function(counts.col) {
  counts.col <- as.integer(counts.col)
  rep.int(seq_along(counts.col), counts.col)
}

.np_bind_data_frames_fast <- function(xdat, ydat) {
  if (!is.data.frame(xdat) || !is.data.frame(ydat))
    return(data.frame(xdat, ydat))
  if (nrow(xdat) != nrow(ydat))
    stop("bound data frames must have the same number of rows")

  out <- c(unclass(xdat), unclass(ydat))
  names(out) <- make.names(c(names(xdat), names(ydat)), unique = TRUE)
  class(out) <- "data.frame"
  attr(out, "row.names") <- attr(xdat, "row.names")
  out
}

.np_active_boot_sample <- function(xdat, counts.col, ydat = NULL) {
  counts.col <- as.double(counts.col)
  if (length(counts.col) != nrow(xdat))
    stop("bootstrap counts must align with training rows")
  if (!is.null(ydat) && nrow(ydat) != nrow(xdat))
    stop("bootstrap x/y training rows must align")

  active <- counts.col > 0
  if (!any(active))
    stop("bootstrap counts must activate at least one training row")

  idx <- which(active)
  list(
    xdat = xdat[idx, , drop = FALSE],
    ydat = if (is.null(ydat)) NULL else ydat[idx, , drop = FALSE],
    weights = matrix(counts.col[idx], ncol = 1L),
    n.total = sum(counts.col)
  )
}

.np_active_boot_sample_matrix <- function(xmat, counts.col, ymat = NULL) {
  counts.col <- as.double(counts.col)
  if (length(counts.col) != nrow(xmat))
    stop("bootstrap counts must align with training rows")
  if (!is.null(ymat) && nrow(ymat) != nrow(xmat))
    stop("bootstrap x/y training rows must align")

  active <- counts.col > 0
  if (!any(active))
    stop("bootstrap counts must activate at least one training row")

  idx <- which(active)
  list(
    xmat = xmat[idx, , drop = FALSE],
    ymat = if (is.null(ymat)) NULL else ymat[idx, , drop = FALSE],
    weights = matrix(counts.col[idx], ncol = 1L),
    n.total = sum(counts.col)
  )
}

.np_block_counts_drawer <- function(n,
                                    B,
                                    blocklen,
                                    sim = c("fixed", "geom"),
                                    n.sim = n,
                                    endcorr = TRUE) {
  sim <- match.arg(sim)
  n <- as.integer(n)
  B <- as.integer(B)
  n.sim <- as.integer(n.sim)
  blocklen <- as.integer(blocklen)

  if (n < 1L || B < 1L || n.sim < 1L)
    stop("invalid block bootstrap dimensions")
  if (length(blocklen) != 1L || is.na(blocklen) || blocklen < 1L || blocklen > n)
    stop("invalid block length for block bootstrap")

  if (identical(blocklen, 1L)) {
    prob <- rep.int(1 / n, n)

    return(function(start, stopi) {
      start <- as.integer(start)
      stopi <- as.integer(stopi)
      if (start < 1L || stopi < start || stopi > B)
        stop("invalid block bootstrap chunk bounds")

      stats::rmultinom(n = stopi - start + 1L, size = n.sim, prob = prob)
    })
  }

  ts.array <- utils::getFromNamespace("ts.array", "boot")
  make.ends <- utils::getFromNamespace("make.ends", "boot")

  function(start, stopi) {
    start <- as.integer(start)
    stopi <- as.integer(stopi)
    if (start < 1L || stopi < start || stopi > B)
      stop("invalid block bootstrap chunk bounds")

    bsz <- stopi - start + 1L
    ts.draws <- ts.array(
      n = n,
      n.sim = n.sim,
      R = bsz,
      l = blocklen,
      sim = sim,
      endcorr = isTRUE(endcorr)
    )

    starts <- as.matrix(ts.draws$starts)
    lengths <- ts.draws$lengths
    idx <- seq_len(bsz)
    out <- matrix(0.0, nrow = n, ncol = length(idx))

    for (jj in seq_along(idx)) {
      rr <- idx[jj]
      ends <- if (identical(sim, "geom")) {
        cbind(starts[rr, ], lengths[rr, ])
      } else {
        cbind(starts[rr, ], lengths)
      }

      inds <- apply(ends, 1L, make.ends, n)
      inds <- if (is.list(inds)) {
        as.integer(unlist(inds)[seq_len(n.sim)])
      } else {
        as.integer(inds)[seq_len(n.sim)]
      }
      out[, jj] <- tabulate(inds, nbins = n)
    }

    out
  }
}

.np_inid_lc_boot_from_hat <- function(H,
                                      ydat,
                                      B,
                                      counts = NULL,
                                      counts.drawer = NULL,
                                      progress.label = NULL) {
  H <- as.matrix(H)
  ydat <- as.double(ydat)
  B <- as.integer(B)
  n <- length(ydat)
  if (B < 1L)
    stop("argument 'plot.errors.boot.num' must be a positive integer")
  if (ncol(H) != n)
    stop("hat matrix columns must match length of ydat")

  W <- t(H)
  Wy <- W * ydat
  t0 <- as.vector(H %*% ydat)

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    den <- crossprod(counts.mat, W)
    num <- crossprod(counts.mat, Wy)
    return(list(
      t = num / pmax(den, .Machine$double.eps),
      t0 = t0
    ))
  }

  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  prob <- rep.int(1 / n, n)
  tmat <- matrix(NA_real_, nrow = B, ncol = nrow(H))
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)

  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = prob)
    }
    den <- crossprod(counts.chunk, W)
    num <- crossprod(counts.chunk, Wy)
    tmat[start:stopi, ] <- num / pmax(den, .Machine$double.eps)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_lp_unpack_sym_row <- function(mrow, p) {
  A <- matrix(0.0, nrow = p, ncol = p)
  idx <- 1L
  for (a in seq_len(p)) {
    for (b in a:p) {
      A[a, b] <- mrow[idx]
      A[b, a] <- mrow[idx]
      idx <- idx + 1L
    }
  }
  A
}

.np_inid_lp_predict_row <- function(A, z, rhs, ridge.grid) {
  ridge.grid <- as.double(ridge.grid)
  if (!length(ridge.grid) || anyNA(ridge.grid) || any(!is.finite(ridge.grid)) || any(ridge.grid < 0))
    stop("argument 'ridge.grid' must be a non-empty non-negative finite numeric vector")
  z <- as.double(z)
  if (!length(z))
    return(NA_real_)
  z1 <- z[1L]

  for (ridge in ridge.grid) {
    Ar <- A
    zr <- z
    if (ridge > 0)
      diag(Ar) <- diag(Ar) + ridge
    if (ridge > 0)
      zr[1L] <- z1 + ridge * z1 / NZD(Ar[1L, 1L])
    beta <- tryCatch(
      drop(solve(Ar, matrix(zr, ncol = 1L))),
      error = function(e) NULL
    )
    if (!is.null(beta) && all(is.finite(beta)))
      return(sum(rhs * beta))
  }

  NA_real_
}

.np_inid_lp_predict_chunk_general <- function(Mvals, Zvals, rhs, ridge.grid) {
  Mvals <- as.matrix(Mvals)
  Zvals <- as.matrix(Zvals)
  rhs <- as.double(rhs)

  bsz <- nrow(Mvals)
  p <- ncol(Zvals)
  out <- numeric(bsz)

  for (ii in seq_len(bsz)) {
    A <- .np_inid_lp_unpack_sym_row(mrow = Mvals[ii, ], p = p)
    out[ii] <- .np_inid_lp_predict_row(
      A = A,
      z = as.double(Zvals[ii, ]),
      rhs = rhs,
      ridge.grid = ridge.grid
    )
  }

  out
}

.np_inid_lp_predict_chunk <- function(Mvals, Zvals, rhs, ridge.grid) {
  Mvals <- as.matrix(Mvals)
  Zvals <- as.matrix(Zvals)
  rhs <- as.double(rhs)

  bsz <- nrow(Mvals)
  p <- ncol(Zvals)
  out <- rep(NA_real_, bsz)

  if (p == 1L) {
    den <- as.double(Mvals[, 1L])
    out <- rhs[1L] * as.double(Zvals[, 1L]) / pmax(den, .Machine$double.eps)
    return(out)
  }

  if (p == 2L) {
    a <- as.double(Mvals[, 1L])
    b <- as.double(Mvals[, 2L])
    c <- as.double(Mvals[, 3L])
    u <- as.double(Zvals[, 1L])
    v <- as.double(Zvals[, 2L])

    det <- a * c - b * b
    good <- is.finite(det) & (abs(det) > .Machine$double.eps)
    if (any(good)) {
      invdet <- 1 / det[good]
      beta1 <- (c[good] * u[good] - b[good] * v[good]) * invdet
      beta2 <- (a[good] * v[good] - b[good] * u[good]) * invdet
      out[good] <- rhs[1L] * beta1 + rhs[2L] * beta2
    }
  } else if (p == 3L) {
    a <- as.double(Mvals[, 1L])
    b <- as.double(Mvals[, 2L])
    c <- as.double(Mvals[, 3L])
    d <- as.double(Mvals[, 4L])
    e <- as.double(Mvals[, 5L])
    f <- as.double(Mvals[, 6L])
    u <- as.double(Zvals[, 1L])
    v <- as.double(Zvals[, 2L])
    w <- as.double(Zvals[, 3L])

    det <- a * (d * f - e * e) - b * (b * f - c * e) + c * (b * e - c * d)
    good <- is.finite(det) & (abs(det) > .Machine$double.eps)
    if (any(good)) {
      c11 <- d[good] * f[good] - e[good] * e[good]
      c12 <- c[good] * e[good] - b[good] * f[good]
      c13 <- b[good] * e[good] - c[good] * d[good]
      c22 <- a[good] * f[good] - c[good] * c[good]
      c23 <- b[good] * c[good] - a[good] * e[good]
      c33 <- a[good] * d[good] - b[good] * b[good]
      invdet <- 1 / det[good]

      beta1 <- (c11 * u[good] + c12 * v[good] + c13 * w[good]) * invdet
      beta2 <- (c12 * u[good] + c22 * v[good] + c23 * w[good]) * invdet
      beta3 <- (c13 * u[good] + c23 * v[good] + c33 * w[good]) * invdet
      out[good] <- rhs[1L] * beta1 + rhs[2L] * beta2 + rhs[3L] * beta3
    }
  }

  bad <- which(!is.finite(out))
  if (length(bad)) {
    p <- ncol(Zvals)
    for (ii in bad) {
      A <- .np_inid_lp_unpack_sym_row(mrow = Mvals[ii, ], p = p)
      out[ii] <- .np_inid_lp_predict_row(
        A = A,
        z = as.double(Zvals[ii, ]),
        rhs = rhs,
        ridge.grid = ridge.grid
      )
    }
  }

  out
}

.np_inid_lp_predict_row_multi <- function(A, Z, rhs, ridge.grid) {
  ridge.grid <- as.double(ridge.grid)
  if (!length(ridge.grid) || anyNA(ridge.grid) || any(!is.finite(ridge.grid)) || any(ridge.grid < 0))
    stop("argument 'ridge.grid' must be a non-empty non-negative finite numeric vector")
  Z <- as.matrix(Z)
  if (!length(Z))
    return(numeric(0))
  rhs <- as.double(rhs)
  p <- nrow(Z)

  if (p == 1L) {
    den <- as.double(A[1L, 1L])
    return(rhs[1L] * as.double(Z[1L, ]) / pmax(den, .Machine$double.eps))
  }

  if (p == 2L) {
    a <- as.double(A[1L, 1L])
    b <- as.double(A[1L, 2L])
    c <- as.double(A[2L, 2L])
    det <- a * c - b * b
    if (is.finite(det) && abs(det) > .Machine$double.eps) {
      coeff1 <- (rhs[1L] * c - rhs[2L] * b) / det
      coeff2 <- (rhs[2L] * a - rhs[1L] * b) / det
      return(coeff1 * as.double(Z[1L, ]) + coeff2 * as.double(Z[2L, ]))
    }
  } else if (p == 3L) {
    a <- as.double(A[1L, 1L])
    b <- as.double(A[1L, 2L])
    c <- as.double(A[1L, 3L])
    d <- as.double(A[2L, 2L])
    e <- as.double(A[2L, 3L])
    f <- as.double(A[3L, 3L])
    det <- a * (d * f - e * e) - b * (b * f - c * e) + c * (b * e - c * d)
    if (is.finite(det) && abs(det) > .Machine$double.eps) {
      c11 <- d * f - e * e
      c12 <- c * e - b * f
      c13 <- b * e - c * d
      c22 <- a * f - c * c
      c23 <- b * c - a * e
      c33 <- a * d - b * b
      coeff1 <- (rhs[1L] * c11 + rhs[2L] * c12 + rhs[3L] * c13) / det
      coeff2 <- (rhs[1L] * c12 + rhs[2L] * c22 + rhs[3L] * c23) / det
      coeff3 <- (rhs[1L] * c13 + rhs[2L] * c23 + rhs[3L] * c33) / det
      return(
        coeff1 * as.double(Z[1L, ]) +
          coeff2 * as.double(Z[2L, ]) +
          coeff3 * as.double(Z[3L, ])
      )
    }
  }

  z1 <- Z[1L, , drop = TRUE]

  for (ridge in ridge.grid) {
    Ar <- A
    Zr <- Z
    if (ridge > 0)
      diag(Ar) <- diag(Ar) + ridge
    if (ridge > 0)
      Zr[1L, ] <- z1 + ridge * z1 / NZD(Ar[1L, 1L])
    beta <- tryCatch(
      solve(Ar, Zr),
      error = function(e) NULL
    )
    if (!is.null(beta) && all(is.finite(beta)))
      return(as.numeric(crossprod(rhs, beta)))
  }

  rep(NA_real_, ncol(Z))
}

.np_inid_lp_predict_chunk_multi <- function(Mvals, Zmats, rhs, ridge.grid) {
  Mvals <- as.matrix(Mvals)
  rhs <- as.double(rhs)
  if (!length(Zmats))
    return(matrix(numeric(0), nrow = nrow(Mvals), ncol = 0L))

  bsz <- nrow(Mvals)
  p <- length(Zmats)
  g <- ncol(Zmats[[1L]])
  out <- matrix(NA_real_, nrow = bsz, ncol = g)

  if (p == 1L) {
    den <- as.double(Mvals[, 1L])
    out <- rhs[1L] * as.matrix(Zmats[[1L]]) / pmax(den, .Machine$double.eps)
    return(out)
  } else if (p == 2L) {
    a <- as.double(Mvals[, 1L])
    b <- as.double(Mvals[, 2L])
    c <- as.double(Mvals[, 3L])
    det <- a * c - b * b
    good <- is.finite(det) & (abs(det) > .Machine$double.eps)
    if (any(good)) {
      coeff1 <- (rhs[1L] * c[good] - rhs[2L] * b[good]) / det[good]
      coeff2 <- (rhs[2L] * a[good] - rhs[1L] * b[good]) / det[good]
      out[good, ] <-
        sweep(as.matrix(Zmats[[1L]])[good, , drop = FALSE], 1L, coeff1, "*") +
        sweep(as.matrix(Zmats[[2L]])[good, , drop = FALSE], 1L, coeff2, "*")
    }
  } else if (p == 3L) {
    a <- as.double(Mvals[, 1L])
    b <- as.double(Mvals[, 2L])
    c <- as.double(Mvals[, 3L])
    d <- as.double(Mvals[, 4L])
    e <- as.double(Mvals[, 5L])
    f <- as.double(Mvals[, 6L])
    det <- a * (d * f - e * e) - b * (b * f - c * e) + c * (b * e - c * d)
    good <- is.finite(det) & (abs(det) > .Machine$double.eps)
    if (any(good)) {
      c11 <- d[good] * f[good] - e[good] * e[good]
      c12 <- c[good] * e[good] - b[good] * f[good]
      c13 <- b[good] * e[good] - c[good] * d[good]
      c22 <- a[good] * f[good] - c[good] * c[good]
      c23 <- b[good] * c[good] - a[good] * e[good]
      c33 <- a[good] * d[good] - b[good] * b[good]
      coeff1 <- (rhs[1L] * c11 + rhs[2L] * c12 + rhs[3L] * c13) / det[good]
      coeff2 <- (rhs[1L] * c12 + rhs[2L] * c22 + rhs[3L] * c23) / det[good]
      coeff3 <- (rhs[1L] * c13 + rhs[2L] * c23 + rhs[3L] * c33) / det[good]
      out[good, ] <-
        sweep(as.matrix(Zmats[[1L]])[good, , drop = FALSE], 1L, coeff1, "*") +
        sweep(as.matrix(Zmats[[2L]])[good, , drop = FALSE], 1L, coeff2, "*") +
        sweep(as.matrix(Zmats[[3L]])[good, , drop = FALSE], 1L, coeff3, "*")
    }
  }

  for (ii in seq_len(bsz)) {
    if (all(is.finite(out[ii, ])))
      next
    A <- .np_inid_lp_unpack_sym_row(mrow = Mvals[ii, ], p = p)
    Z <- do.call(rbind, lapply(Zmats, function(zmat) zmat[ii, , drop = FALSE]))
    out[ii, ] <- .np_inid_lp_predict_row_multi(
      A = A,
      Z = Z,
      rhs = rhs,
      ridge.grid = ridge.grid
    )
  }

  out
}

.np_inid_boot_from_regression_localpoly_frozen <- function(xdat,
                                                           exdat,
                                                           bws,
                                                           ydat,
                                                           B,
                                                           counts = NULL,
                                                           counts.drawer = NULL,
                                                           ridge = 1.0e-12,
                                                           gradients = FALSE,
                                                           gradient.order = 1L,
                                                           slice.index = 1L,
                                                           prep.label = NULL,
                                                           progress.label = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  ydat <- as.double(ydat)
  B <- as.integer(B)

  n <- nrow(xdat)
  neval <- nrow(exdat)
  if (length(ydat) != n)
    stop("length of ydat must match training rows")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid inid regression bootstrap dimensions")
  regtype <- if (is.null(bws$regtype)) "lc" else as.character(bws$regtype)
  if (identical(regtype, "lc"))
    stop("local-polynomial frozen regression helper requires regtype='ll' or 'lp'")

  ncon <- bws$ncon
  degree <- if (identical(regtype, "ll")) {
    rep.int(1L, ncon)
  } else {
    npValidateGlpDegree(
      regtype = "lp",
      degree = bws$degree,
      ncon = ncon
    )
  }

  basis <- npValidateLpBasis(
    regtype = "lp",
    basis = if (is.null(bws$basis)) "glp" else bws$basis
  )
  bernstein.basis <- npValidateGlpBernstein(
    regtype = "lp",
    bernstein.basis = isTRUE(bws$bernstein.basis)
  )

  gradient.vec <- NULL
  if (isTRUE(gradients)) {
    cont.idx <- which(bws$icon)
    cpos <- match(slice.index, cont.idx)
    if (is.na(cpos))
      stop("fixed regression gradient helper requires a continuous slice", call. = FALSE)

    gradient.vec <- integer(ncon)
    if (identical(regtype, "lp")) {
      gradient.order <- npValidateGlpGradientOrder(
        regtype = "lp",
        gradient.order = gradient.order,
        ncon = ncon
      )
      if (gradient.order[cpos] > degree[cpos]) {
        return(list(
          t = matrix(NA_real_, nrow = B, ncol = neval),
          t0 = rep(NA_real_, neval)
        ))
      }
      gradient.vec[cpos] <- gradient.order[cpos]
    } else {
      gradient.vec[cpos] <- 1L
    }
  }

  kw <- npksum(
    txdat = xdat,
    exdat = exdat,
    bws = bws,
    return.kernel.weights = TRUE,
    bandwidth.divide = identical(bws$type, "adaptive_nn"),
    leave.one.out = FALSE
  )$kw
  if (!is.matrix(kw))
    kw <- matrix(kw, nrow = n)
  if (nrow(kw) != n || ncol(kw) != neval)
    stop("kernel-weight matrix shape mismatch")

  W <- W.lp(
    xdat = xdat,
    degree = degree,
    basis = basis,
    bernstein.basis = bernstein.basis
  )
  W.eval <- W.lp(
    xdat = xdat,
    exdat = exdat,
    degree = degree,
    gradient.vec = gradient.vec,
    basis = basis,
    bernstein.basis = bernstein.basis
  )
  W <- as.matrix(W)
  W.eval <- as.matrix(W.eval)

  if (nrow(W) != n || nrow(W.eval) != neval || ncol(W.eval) != ncol(W))
    stop("regression moment design matrix shape mismatch")

  p <- ncol(W)
  mcols <- p * (p + 1L) / 2L
  rhs <- W.eval
  ones <- matrix(1.0, nrow = n, ncol = 1L)
  ridge.grid <- npRidgeSequenceFromBase(n.train = n, ridge.base = ridge, cap = 1.0)

  Mfeat <- vector("list", neval)
  Zfeat <- vector("list", neval)
  t0 <- numeric(neval)
  prep.label <- if (is.null(prep.label)) {
    if (!is.null(counts.drawer)) "Preparing plot bootstrap block" else "Preparing plot bootstrap inid"
  } else {
    prep.label
  }
  prep.progress <- .np_plot_stage_progress_begin(total = neval, label = prep.label)
  prep.progress.active <- TRUE
  on.exit({
    if (isTRUE(prep.progress.active))
      .np_plot_progress_end(prep.progress)
  }, add = TRUE)

  for (i in seq_len(neval)) {
    if (i == 1L)
      prep.progress$last_emit <- -Inf
    prep.progress <- .np_progress_step(
      state = prep.progress,
      done = i - 1L,
      detail = sprintf("eval %d/%d", i, neval)
    )

    k <- as.double(kw[, i])
    WK <- W * k
    Zfeat[[i]] <- WK * ydat

    mf <- matrix(0.0, nrow = n, ncol = mcols)
    idx <- 1L
    for (a in seq_len(p)) {
      for (b in a:p) {
        mf[, idx] <- WK[, a] * W[, b]
        idx <- idx + 1L
      }
    }
    Mfeat[[i]] <- mf

    M0 <- crossprod(ones, mf)
    Z0 <- crossprod(ones, Zfeat[[i]])
    t0[i] <- if (p > 3L) {
      .np_inid_lp_predict_chunk_general(
        Mvals = M0,
        Zvals = Z0,
        rhs = rhs[i, ],
        ridge.grid = ridge.grid
      )[1L]
    } else {
      .np_inid_lp_predict_chunk(
        Mvals = M0,
        Zvals = Z0,
        rhs = rhs[i, ],
        ridge.grid = ridge.grid
      )[1L]
    }
    prep.progress <- .np_plot_progress_tick(state = prep.progress, done = i)
  }
  .np_plot_progress_end(prep.progress)
  prep.progress.active <- FALSE

  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  fill_chunk <- function(counts.chunk, start, stopi) {
    for (i in seq_len(neval)) {
      Mvals <- crossprod(counts.chunk, Mfeat[[i]])
      Zvals <- crossprod(counts.chunk, Zfeat[[i]])
      tmat[start:stopi, i] <<- if (p > 3L) {
        .np_inid_lp_predict_chunk_general(
          Mvals = Mvals,
          Zvals = Zvals,
          rhs = rhs[i, ],
          ridge.grid = ridge.grid
        )
      } else {
        .np_inid_lp_predict_chunk(
          Mvals = Mvals,
          Zvals = Zvals,
          rhs = rhs[i, ],
          ridge.grid = ridge.grid
        )
      }
    }
  }

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    fill_chunk(counts.chunk = counts.mat, start = 1L, stopi = B)
    progress <- .np_plot_progress_tick(state = progress, done = B, force = TRUE)
  } else {
    chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
    chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
    start <- 1L
    while (start <= B) {
      stopi <- min(B, start + chunk.controller$chunk.size - 1L)
      bsz <- stopi - start + 1L
      chunk.started <- .np_progress_now()
      counts.chunk <- if (!is.null(counts.drawer)) {
        .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
      } else {
        stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
      }
      fill_chunk(counts.chunk = counts.chunk, start = start, stopi = stopi)
      progress <- .np_plot_progress_tick(state = progress, done = stopi)
      chunk.controller <- .np_plot_progress_chunk_observe(
        controller = chunk.controller,
        bsz = bsz,
        elapsed.sec = .np_progress_now() - chunk.started
      )
      start <- stopi + 1L
    }
  }

  if (any(!is.finite(t0)) || any(!is.finite(tmat)))
    stop("inid regression helper path produced non-finite values")

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_regression_localpoly_fixed <- function(xdat,
                                                          exdat,
                                                          bws,
                                                          ydat,
                                                          B,
                                                          counts = NULL,
                                                          counts.drawer = NULL,
                                                          ridge = 1.0e-12,
                                                          gradients = FALSE,
                                                          gradient.order = 1L,
                                                          slice.index = 1L,
                                                          prep.label = NULL,
                                                          progress.label = NULL) {
  if (!identical(bws$type, "fixed"))
    stop("local-polynomial fixed regression helper requires bwtype='fixed'")

  .np_inid_boot_from_regression_localpoly_frozen(
    xdat = xdat,
    exdat = exdat,
    bws = bws,
    ydat = ydat,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    ridge = ridge,
    gradients = gradients,
    gradient.order = gradient.order,
    slice.index = slice.index,
    prep.label = prep.label,
    progress.label = progress.label
  )
}

.np_inid_boot_from_regression <- function(xdat,
                                          exdat,
                                          bws,
                                          ydat,
                                          B,
                                          counts = NULL,
                                          counts.drawer = NULL,
                                          ridge = 1.0e-12,
                                          gradients = FALSE,
                                          gradient.order = 1L,
                                          slice.index = 1L,
                                          prep.label = NULL,
                                          progress.label = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  ydat <- as.double(ydat)
  B <- as.integer(B)

  n <- nrow(xdat)
  neval <- nrow(exdat)
  if (length(ydat) != n)
    stop("length of ydat must match training rows")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid inid regression bootstrap dimensions")

  regtype <- if (is.null(bws$regtype)) "lc" else as.character(bws$regtype)
  if (!identical(bws$type, "fixed")) {
    return(.np_inid_boot_from_reghat_exact(
      xdat = xdat,
      exdat = exdat,
      bws = bws,
      ydat = ydat,
        B = B,
        counts = counts,
        counts.drawer = counts.drawer,
        gradients = gradients,
        gradient.order = gradient.order,
        slice.index = slice.index,
        progress.label = progress.label
      ))
  }

  if (isTRUE(gradients)) {
    xi.factor <- isTRUE(slice.index > 0L) &&
      !is.null(bws$xdati) &&
      (isTRUE(bws$xdati$iord[slice.index]) || isTRUE(bws$xdati$iuno[slice.index]))
    if (isTRUE(xi.factor)) {
      return(.np_inid_boot_from_reghat_exact(
        xdat = xdat,
        exdat = exdat,
        bws = bws,
        ydat = ydat,
        B = B,
        counts = counts,
        counts.drawer = counts.drawer,
        gradients = TRUE,
        gradient.order = gradient.order,
        slice.index = slice.index,
        progress.label = progress.label
      ))
    }

    if (!identical(regtype, "lc")) {
      return(.np_inid_boot_from_regression_localpoly_fixed(
        xdat = xdat,
        exdat = exdat,
        bws = bws,
        ydat = ydat,
        B = B,
        counts = counts,
        counts.drawer = counts.drawer,
        ridge = ridge,
        gradients = TRUE,
        gradient.order = gradient.order,
        slice.index = slice.index,
        prep.label = prep.label,
        progress.label = progress.label
      ))
    }

    return(.np_inid_boot_from_reghat_exact(
      xdat = xdat,
      exdat = exdat,
      bws = bws,
      ydat = ydat,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      gradients = TRUE,
      gradient.order = gradient.order,
      slice.index = slice.index,
      progress.label = progress.label
    ))
  }

  if (identical(regtype, "lc")) {
    H <- suppressWarnings(
      tryCatch(
        npreghat.rbandwidth(
          bws = bws,
          txdat = xdat,
          exdat = exdat,
          s = 0L,
          output = "matrix"
        ),
        error = function(e) NULL
      )
    )
    if (!is.null(H)) {
      if (!is.matrix(H))
        H <- matrix(as.double(H), nrow = neval, ncol = n)
      if (nrow(H) == neval && ncol(H) == n) {
        return(.np_inid_lc_boot_from_hat(
          H = H,
          ydat = ydat,
          B = B,
          counts = counts,
          counts.drawer = counts.drawer,
          progress.label = progress.label
        ))
      }
    }
  }

  .np_inid_boot_from_regression_localpoly_fixed(
    xdat = xdat,
    exdat = exdat,
    bws = bws,
    ydat = ydat,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    ridge = ridge,
    gradients = FALSE,
    gradient.order = gradient.order,
    slice.index = slice.index,
    prep.label = prep.label,
    progress.label = progress.label
  )
}

.np_inid_boot_from_reghat_exact <- function(xdat,
                                            exdat,
                                            bws,
                                            ydat,
                                            B,
                                            counts = NULL,
                                            counts.drawer = NULL,
                                            gradients = FALSE,
                                            gradient.order = 1L,
                                            slice.index = 1L,
                                            progress.label = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  ydat <- as.double(ydat)
  B <- as.integer(B)

  n <- nrow(xdat)
  neval <- nrow(exdat)
  if (length(ydat) != n)
    stop("length of ydat must match training rows in exact regression bootstrap helper")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid exact regression bootstrap dimensions")

  fit_hat <- function(x.train, y.train) {
    fit <- .np_regression_direct(
      bws = bws,
      txdat = x.train,
      tydat = y.train,
      exdat = exdat,
      gradients = isTRUE(gradients),
      gradient.order = gradient.order
    )
    if (isTRUE(gradients))
      as.vector(fit$grad[, slice.index])
    else
      as.vector(fit$mean)
  }

  t0 <- fit_hat(x.train = xdat, y.train = ydat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  if (is.null(counts.drawer))
    chunk.size <- min(chunk.size, .np_plot_progress_chunk_cap(B))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit_hat(
        x.train = xdat[idx, , drop = FALSE],
        y.train = ydat[idx]
      )
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_reghat_frozen <- function(xdat,
                                             exdat,
                                             bws,
                                             ydat,
                                             B,
                                             counts = NULL,
                                             counts.drawer = NULL,
                                             gradients = FALSE,
                                             gradient.order = 1L,
                                             slice.index = 1L,
                                             prep.label = NULL,
                                             progress.label = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  ydat <- as.double(ydat)
  B <- as.integer(B)

  n <- nrow(xdat)
  neval <- nrow(exdat)
  if (length(ydat) != n)
    stop("length of ydat must match training rows in frozen regression bootstrap helper")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid frozen regression bootstrap dimensions")
  if (identical(bws$type, "fixed"))
    stop("frozen regression bootstrap helper is for nonfixed bandwidths only")

  regtype <- if (is.null(bws$regtype)) "lc" else as.character(bws$regtype)
  xi.factor <- isTRUE(slice.index > 0L) &&
    !is.null(bws$xdati) &&
    (isTRUE(bws$xdati$iord[slice.index]) || isTRUE(bws$xdati$iuno[slice.index]))

  if (isTRUE(xi.factor)) {
    stop(
      "plot.errors.boot.nonfixed='frozen' currently supports nonfixed regression means and continuous gradients only; use 'exact' for categorical slices",
      call. = FALSE
    )
  }

  if (identical(regtype, "lc")) {
    if (isTRUE(gradients)) {
      stop(
        "plot.errors.boot.nonfixed='frozen' currently supports nonfixed local-constant regression means only; use 'exact' for local-constant gradients",
        call. = FALSE
      )
    }

    H <- suppressWarnings(
      tryCatch(
        npreghat.rbandwidth(
          bws = bws,
          txdat = xdat,
          exdat = exdat,
          s = 0L,
          output = "matrix"
        ),
        error = function(e) NULL
      )
    )
    if (is.null(H))
      stop("failed to construct frozen nonfixed regression hat matrix", call. = FALSE)
    if (!is.matrix(H))
      H <- matrix(as.double(H), nrow = neval, ncol = n)
    if (nrow(H) != neval || ncol(H) != n)
      stop("frozen nonfixed regression hat matrix shape mismatch", call. = FALSE)

    return(.np_inid_lc_boot_from_hat(
      H = H,
      ydat = ydat,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      progress.label = progress.label
    ))
  }

  .np_inid_boot_from_regression_localpoly_frozen(
    xdat = xdat,
    exdat = exdat,
    bws = bws,
    ydat = ydat,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    gradients = gradients,
    gradient.order = gradient.order,
    slice.index = slice.index,
    prep.label = prep.label,
    progress.label = progress.label
  )
}

.np_inid_boot_from_index <- function(xdat,
                                     ydat,
                                     bws,
                                     B,
                                     counts = NULL,
                                     counts.drawer = NULL,
                                     gradients = FALSE,
                                     frozen = FALSE,
                                     idx.eval = NULL,
                                     progress.label = NULL) {
  if (isTRUE(frozen)) {
    return(.np_inid_boot_from_index_frozen(
      xdat = xdat,
      ydat = ydat,
      bws = bws,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      gradients = gradients,
      idx.eval = idx.eval,
      progress.label = progress.label
    ))
  }

  if (!identical(bws$type, "fixed")) {
    return(.np_inid_boot_from_index_exact(
      xdat = xdat,
      ydat = ydat,
      bws = bws,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      gradients = gradients,
      idx.eval = idx.eval,
      progress.label = progress.label
    ))
  }

  if (isTRUE(gradients)) {
    return(.np_inid_boot_from_index_gradient_fixed(
      xdat = xdat,
      ydat = ydat,
      bws = bws,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      idx.eval = idx.eval,
      progress.label = progress.label
    ))
  }

  xdat <- toFrame(xdat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (length(ydat) != n)
    stop("length of ydat must match training rows in single-index inid helper")
  if (n < 1L || B < 1L)
    stop("invalid single-index inid helper dimensions")
  if (isTRUE(gradients))
    stop("single-index inid helper does not support gradients", call. = FALSE)

  idx.train <- data.frame(index = as.vector(toMatrix(xdat) %*% bws$beta))
  if (is.null(idx.eval))
    idx.eval <- idx.train
  idx.eval <- toFrame(idx.eval)
  y.num <- if (is.factor(ydat)) {
    yadj <- adjustLevels(data.frame(ydat), bws$ydati)
    bws$ydati$all.dlev[[1L]][as.integer(yadj[, 1L])]
  } else {
    as.double(ydat)
  }

  spec <- .npindex_resolve_spec(bws, where = "single-index inid helper")
  regtype <- spec$regtype.engine
  kbw <- .np_indexhat_kbw(bws = bws, idx.train = idx.train)
  kw <- .np_kernel_weights_direct(
    bws = kbw,
    txdat = idx.train,
    exdat = idx.eval,
    bandwidth.divide = TRUE,
    kernel.pow = 1.0
  )

  if (!is.matrix(kw))
    kw <- matrix(kw, nrow = n)
  neval <- nrow(idx.eval)
  if (nrow(kw) != n || ncol(kw) != neval)
    stop("single-index inid helper kernel-weight matrix shape mismatch")

  if (identical(regtype, "lc")) {
    H <- sweep(t(kw), 1L, pmax(colSums(kw), .Machine$double.eps), "/",
               check.margin = FALSE)
    return(.np_inid_lc_boot_from_hat(
      H = H,
      ydat = y.num,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      progress.label = progress.label
    ))
  }

  degree <- if (identical(regtype, "ll")) {
    1L
  } else {
    spec$degree.engine
  }

  W <- W.lp(
    xdat = idx.train,
    degree = degree,
    basis = spec$basis.engine,
    bernstein.basis = spec$bernstein.basis.engine
  )
  W.eval <- W.lp(
    xdat = idx.train,
    exdat = idx.eval,
    degree = degree,
    basis = spec$basis.engine,
    bernstein.basis = spec$bernstein.basis.engine
  )
  W <- as.matrix(W)
  W.eval <- as.matrix(W.eval)

  p <- ncol(W)
  mcols <- p * (p + 1L) / 2L
  ridge.grid <- npRidgeSequenceFromBase(n.train = n, ridge.base = 1.0e-12, cap = 1.0)
  rhs <- W.eval
  ones <- matrix(1.0, nrow = n, ncol = 1L)

  Mfeat <- vector("list", neval)
  Zfeat <- vector("list", neval)
  t0 <- numeric(neval)

  for (i in seq_len(neval)) {
    k <- as.double(kw[, i])
    WK <- W * k
    Zfeat[[i]] <- WK * y.num

    mf <- matrix(0.0, nrow = n, ncol = mcols)
    idx <- 1L
    for (a in seq_len(p)) {
      for (b in a:p) {
        mf[, idx] <- WK[, a] * W[, b]
        idx <- idx + 1L
      }
    }
    Mfeat[[i]] <- mf

    M0 <- crossprod(ones, mf)
    Z0 <- crossprod(ones, Zfeat[[i]])
    t0[i] <- if (p > 3L) {
      .np_inid_lp_predict_chunk_general(
        Mvals = M0,
        Zvals = Z0,
        rhs = rhs[i, ],
        ridge.grid = ridge.grid
      )[1L]
    } else {
      .np_inid_lp_predict_chunk(
        Mvals = M0,
        Zvals = Z0,
        rhs = rhs[i, ],
        ridge.grid = ridge.grid
      )[1L]
    }
  }

  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  fill_chunk <- function(counts.chunk, start, stopi) {
    for (i in seq_len(neval)) {
      Mvals <- crossprod(counts.chunk, Mfeat[[i]])
      Zvals <- crossprod(counts.chunk, Zfeat[[i]])
      tmat[start:stopi, i] <<- if (p > 3L) {
        .np_inid_lp_predict_chunk_general(
          Mvals = Mvals,
          Zvals = Zvals,
          rhs = rhs[i, ],
          ridge.grid = ridge.grid
        )
      } else {
        .np_inid_lp_predict_chunk(
          Mvals = Mvals,
          Zvals = Zvals,
          rhs = rhs[i, ],
          ridge.grid = ridge.grid
        )
      }
    }
  }

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    fill_chunk(counts.chunk = counts.mat, start = 1L, stopi = B)
    progress <- .np_plot_progress_tick(state = progress, done = B, force = TRUE)
  } else {
    chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
    chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
    start <- 1L
    while (start <= B) {
      stopi <- min(B, start + chunk.controller$chunk.size - 1L)
      bsz <- stopi - start + 1L
      chunk.started <- .np_progress_now()
      counts.chunk <- if (!is.null(counts.drawer)) {
        .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
      } else {
        stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
      }
      fill_chunk(counts.chunk = counts.chunk, start = start, stopi = stopi)
      progress <- .np_plot_progress_tick(state = progress, done = stopi)
      chunk.controller <- .np_plot_progress_chunk_observe(
        controller = chunk.controller,
        bsz = bsz,
        elapsed.sec = .np_progress_now() - chunk.started
      )
      start <- stopi + 1L
    }
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_index_frozen <- function(xdat,
                                            ydat,
                                            bws,
                                            B,
                                            counts = NULL,
                                            counts.drawer = NULL,
                                            gradients = FALSE,
                                            idx.eval = NULL,
                                            progress.label = NULL) {
  xdat <- toFrame(xdat)
  ydat <- as.double(ydat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (length(ydat) != n)
    stop("length of ydat must match training rows in frozen single-index bootstrap helper")
  if (n < 1L || B < 1L)
    stop("invalid frozen single-index bootstrap dimensions")
  if (identical(bws$type, "fixed"))
    stop("frozen single-index bootstrap helper is for nonfixed bandwidths only")

  idx.train <- data.frame(index = as.vector(toMatrix(xdat) %*% bws$beta))
  if (is.null(idx.eval))
    idx.eval <- idx.train
  idx.eval <- toFrame(idx.eval)

  H <- .np_plot_singleindex_hat_matrix_index(
    bws = bws,
    idx.train = idx.train,
    idx.eval = idx.eval,
    s = if (isTRUE(gradients)) 1L else 0L
  )

  if (!isTRUE(gradients)) {
    return(.np_inid_lc_boot_from_hat(
      H = H,
      ydat = ydat,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      progress.label = progress.label
    ))
  }

  .np_plot_boot_from_frozen_operator(
    H = H,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    progress.label = progress.label
  )
}

.np_inid_boot_from_index_gradient_fixed <- function(xdat,
                                                    ydat,
                                                    bws,
                                                    B,
                                                    counts = NULL,
                                                    counts.drawer = NULL,
                                                    idx.eval = NULL,
                                                    progress.label = NULL) {
  xdat <- toFrame(xdat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (length(ydat) != n)
    stop("length of ydat must match training rows in single-index fixed gradient helper")
  if (n < 1L || B < 1L)
    stop("invalid single-index fixed gradient helper dimensions")

  idx.train <- data.frame(index = as.vector(toMatrix(xdat) %*% bws$beta))
  if (is.null(idx.eval))
    idx.eval <- idx.train
  idx.eval <- toFrame(idx.eval)
  rbw <- .np_indexhat_rbw(bws = bws, idx.train = idx.train)

  .np_inid_boot_from_regression(
    xdat = idx.train,
    exdat = idx.eval,
    bws = rbw,
    ydat = ydat,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    gradients = TRUE,
    gradient.order = 1L,
    slice.index = 1L,
    progress.label = progress.label
  )
}

.np_inid_boot_from_index_exact <- function(xdat,
                                           ydat,
                                           bws,
                                           B,
                                           counts = NULL,
                                           counts.drawer = NULL,
                                           gradients = FALSE,
                                           idx.eval = NULL,
                                           progress.label = NULL) {
  xdat <- toFrame(xdat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (length(ydat) != n)
    stop("length of ydat must match training rows in exact single-index bootstrap helper")
  if (n < 1L || B < 1L)
    stop("invalid exact single-index bootstrap dimensions")
  if (isTRUE(gradients))
    stop("exact single-index bootstrap helper does not support gradients", call. = FALSE)

  idx.train <- data.frame(index = as.vector(toMatrix(xdat) %*% bws$beta))
  if (is.null(idx.eval))
    idx.eval <- idx.train
  idx.eval <- toFrame(idx.eval)

  fit_hat <- function(x.train, y.train) {
    idx.train.b <- data.frame(index = as.vector(toMatrix(x.train) %*% bws$beta))
    as.vector(.np_plot_singleindex_hat_apply_index(
      bws = bws,
      idx.train = idx.train.b,
      idx.eval = idx.eval,
      y = y.train
    ))
  }

  t0 <- fit_hat(x.train = xdat, y.train = ydat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit_hat(
        x.train = xdat[idx, , drop = FALSE],
        y.train = ydat[idx]
      )
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_scoef_numeric_y <- function(ydat, bws) {
  if (is.factor(ydat)) {
    if (is.null(bws$ydati))
      stop("factor response requires bws$ydati for smooth coefficient inid helper")
    yadj <- adjustLevels(data.frame(ydat), bws$ydati)
    return((bws$ydati$all.dlev[[1L]])[as.integer(yadj[, 1L])])
  }
  as.double(ydat)
}

.np_inid_scoef_predict_row <- function(mrow, zrow, rhs, ridge.grid) {
  A <- .np_inid_lp_unpack_sym_row(mrow = mrow, p = length(rhs))
  tyw <- as.double(zrow)
  nc <- ncol(A)
  ridge.grid <- as.double(ridge.grid)
  if (!length(ridge.grid) || anyNA(ridge.grid) || any(!is.finite(ridge.grid)) || any(ridge.grid < 0))
    stop("argument 'ridge.grid' must be a non-empty non-negative finite numeric vector")

  maxPenalty <- sqrt(.Machine$double.xmax)
  coef.ii <- rep(maxPenalty, nc)
  for (ridge in ridge.grid) {
    ridge.val <- ridge * tyw[1L] / NZD(A[1L, 1L])
    coef.try <- tryCatch(
      solve(
        A + diag(rep(ridge, nc)),
        tyw + c(ridge.val, rep(0, nc - 1L))
      ),
      error = function(e) e
    )
    if (!(inherits(coef.try, "error") || any(!is.finite(coef.try))))
      return(sum(as.double(rhs) * as.double(coef.try)))
  }

  sum(as.double(rhs) * coef.ii)
}

.np_inid_scoef_predict_chunk <- function(Mvals, Zvals, rhs) {
  Mvals <- as.matrix(Mvals)
  Zvals <- as.matrix(Zvals)
  rhs <- as.double(rhs)

  bsz <- nrow(Mvals)
  p <- ncol(Zvals)
  out <- rep(NA_real_, bsz)

  if (p == 1L) {
    den <- as.double(Mvals[, 1L])
    good <- is.finite(den) & (abs(den) > .Machine$double.eps)
    out[good] <- rhs[1L] * as.double(Zvals[good, 1L]) / den[good]
    return(out)
  }

  if (p == 2L) {
    a <- as.double(Mvals[, 1L])
    b <- as.double(Mvals[, 2L])
    c <- as.double(Mvals[, 3L])
    u <- as.double(Zvals[, 1L])
    v <- as.double(Zvals[, 2L])
    det <- a * c - b * b
    good <- is.finite(det) & (abs(det) > .Machine$double.eps)
    if (any(good)) {
      invdet <- 1 / det[good]
      beta1 <- (c[good] * u[good] - b[good] * v[good]) * invdet
      beta2 <- (a[good] * v[good] - b[good] * u[good]) * invdet
      out[good] <- rhs[1L] * beta1 + rhs[2L] * beta2
    }
    return(out)
  }

  if (p == 3L) {
    a <- as.double(Mvals[, 1L])
    b <- as.double(Mvals[, 2L])
    c <- as.double(Mvals[, 3L])
    d <- as.double(Mvals[, 4L])
    e <- as.double(Mvals[, 5L])
    f <- as.double(Mvals[, 6L])
    u <- as.double(Zvals[, 1L])
    v <- as.double(Zvals[, 2L])
    w <- as.double(Zvals[, 3L])

    det <- a * (d * f - e * e) - b * (b * f - c * e) + c * (b * e - c * d)
    good <- is.finite(det) & (abs(det) > .Machine$double.eps)
    if (any(good)) {
      c11 <- d[good] * f[good] - e[good] * e[good]
      c12 <- c[good] * e[good] - b[good] * f[good]
      c13 <- b[good] * e[good] - c[good] * d[good]
      c22 <- a[good] * f[good] - c[good] * c[good]
      c23 <- b[good] * c[good] - a[good] * e[good]
      c33 <- a[good] * d[good] - b[good] * b[good]
      invdet <- 1 / det[good]

      beta1 <- (c11 * u[good] + c12 * v[good] + c13 * w[good]) * invdet
      beta2 <- (c12 * u[good] + c22 * v[good] + c23 * w[good]) * invdet
      beta3 <- (c13 * u[good] + c23 * v[good] + c33 * w[good]) * invdet
      out[good] <- rhs[1L] * beta1 + rhs[2L] * beta2 + rhs[3L] * beta3
    }
    return(out)
  }

  out
}

.np_inid_boot_from_scoef_frozen <- function(txdat,
                                            ydat,
                                            tzdat,
                                            exdat,
                                            ezdat,
                                            bws,
                                            B,
                                            counts = NULL,
                                            counts.drawer = NULL,
                                            leave.one.out = FALSE,
                                            progress.label = NULL) {
  txdat <- toFrame(txdat)
  exdat <- toFrame(exdat)

  miss.z <- missing(tzdat) || is.null(tzdat)
  if (miss.z) {
    tzdat <- txdat
    ezdat <- exdat
  } else {
    tzdat <- toFrame(tzdat)
    ezdat <- toFrame(ezdat)
  }

  if (nrow(txdat) != nrow(tzdat))
    stop("smooth coefficient inid helper requires aligned txdat/tzdat rows")
  if (nrow(exdat) != nrow(ezdat))
    stop("smooth coefficient inid helper requires aligned exdat/ezdat rows")
  if (ncol(txdat) != ncol(exdat))
    stop("smooth coefficient inid helper requires matching txdat/exdat columns")
  if (nrow(txdat) < 1L || nrow(exdat) < 1L || B < 1L)
    stop("invalid smooth coefficient inid helper dimensions")

  if (length(ydat) != nrow(txdat))
    stop("length of ydat must match training rows in smooth coefficient inid helper")

  hat.args <- list(
    bws = bws,
    txdat = txdat,
    exdat = exdat,
    output = "matrix",
    iterate = FALSE,
    leave.one.out = leave.one.out
  )
  if (!miss.z) {
    hat.args$tzdat <- tzdat
    hat.args$ezdat <- ezdat
  }

  H <- do.call(npscoefhat, hat.args)
  .np_inid_lc_boot_from_hat(
    H = H,
    ydat = .np_inid_scoef_numeric_y(ydat = ydat, bws = bws),
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    progress.label = progress.label
  )
}

.np_inid_boot_from_scoef_localpoly_fixed <- function(txdat,
                                                     ydat,
                                                     tzdat,
                                                     exdat,
                                                     ezdat,
                                                     bws,
                                                     B,
                                                     counts = NULL,
                                                     counts.drawer = NULL,
                                                     leave.one.out = FALSE,
                                                     ridge = 1.0e-12,
                                                     prep.label = NULL,
                                                     progress.label = NULL) {
  txdat <- toFrame(txdat)
  exdat <- toFrame(exdat)
  ydat <- .np_inid_scoef_numeric_y(ydat = ydat, bws = bws)
  B <- as.integer(B)
  leave.one.out <- npValidateScalarLogical(leave.one.out, "leave.one.out")

  miss.z <- missing(tzdat) || is.null(tzdat)
  if (miss.z) {
    tzdat <- txdat
    ezdat <- exdat
  } else {
    tzdat <- toFrame(tzdat)
      ezdat <- toFrame(ezdat)
  }

  if (nrow(txdat) != nrow(tzdat))
    stop("smooth coefficient local-polynomial helper requires aligned txdat/tzdat rows")
  if (nrow(exdat) != nrow(ezdat))
    stop("smooth coefficient local-polynomial helper requires aligned exdat/ezdat rows")
  if (ncol(txdat) != ncol(exdat))
    stop("smooth coefficient local-polynomial helper requires matching txdat/exdat columns")
  if (length(ydat) != nrow(txdat))
    stop("length of ydat must match training rows in smooth coefficient local-polynomial helper")
  if (nrow(txdat) < 1L || nrow(exdat) < 1L || B < 1L)
    stop("invalid smooth coefficient local-polynomial helper dimensions")

  spec <- .npscoef_canonical_spec(
    source = bws,
    zdat = tzdat,
    where = "smooth coefficient local-polynomial helper"
  )
  if (!identical(spec$regtype.engine, "lp"))
    stop("smooth coefficient local-polynomial helper requires regtype='ll' or 'lp'")

  txdat <- adjustLevels(txdat, bws$xdati)
  exdat <- adjustLevels(exdat, bws$xdati, allowNewCells = TRUE)
  X.train <- toMatrix(txdat)
  X.eval <- toMatrix(exdat)
  W.train <- cbind(1.0, X.train)
  W.eval <- cbind(1.0, X.eval)

  lp_state <- .npscoef_lp_state(
    bws = bws,
    tzdat = tzdat,
    ezdat = ezdat,
    leave.one.out = leave.one.out,
    where = "smooth coefficient local-polynomial helper"
  )
  tensor.train <- .npscoef_row_tensor_design(W.train, lp_state$W.train)
  tensor.eval <- .npscoef_row_tensor_design(W.eval, lp_state$W.eval)
  kw <- .np_kernel_weights_direct(
    txdat = lp_state$z.train,
    exdat = lp_state$z.eval,
    bws = lp_state$rbw,
    bandwidth.divide = TRUE,
    kernel.pow = 1.0
  )
  if (!is.matrix(kw))
    kw <- matrix(kw, nrow = nrow(tensor.train))
  if (leave.one.out) {
    for (jj in seq_len(min(nrow(kw), ncol(kw))))
      kw[jj, jj] <- 0.0
  }

  n <- nrow(tensor.train)
  neval <- nrow(tensor.eval)
  p <- ncol(tensor.train)
  mcols <- p * (p + 1L) / 2L
  rhs <- tensor.eval
  ones <- matrix(1.0, nrow = n, ncol = 1L)
  ridge.grid <- npRidgeSequenceFromBase(n.train = n, ridge.base = ridge, cap = 1.0)

  Mfeat <- vector("list", neval)
  Zfeat <- vector("list", neval)
  t0 <- numeric(neval)
  prep.label <- if (is.null(prep.label)) {
    if (!is.null(counts.drawer)) "Preparing plot bootstrap block" else "Preparing plot bootstrap inid"
  } else {
    prep.label
  }
  prep.progress <- .np_plot_stage_progress_begin(total = neval, label = prep.label)
  prep.progress.active <- TRUE
  on.exit({
    if (isTRUE(prep.progress.active))
      .np_plot_progress_end(prep.progress)
  }, add = TRUE)

  for (i in seq_len(neval)) {
    if (i == 1L)
      prep.progress$last_emit <- -Inf
    prep.progress <- .np_progress_step(
      state = prep.progress,
      done = i - 1L,
      detail = sprintf("eval %d/%d", i, neval)
    )

    k <- as.double(kw[, i])
    WK <- tensor.train * k
    Zfeat[[i]] <- WK * ydat

    mf <- matrix(0.0, nrow = n, ncol = mcols)
    idx <- 1L
    for (a in seq_len(p)) {
      for (b in a:p) {
        mf[, idx] <- WK[, a] * tensor.train[, b]
        idx <- idx + 1L
      }
    }
    Mfeat[[i]] <- mf

    M0 <- crossprod(ones, mf)
    Z0 <- crossprod(ones, Zfeat[[i]])
    t0[i] <- if (p > 3L) {
      .np_inid_lp_predict_chunk_general(
        Mvals = M0,
        Zvals = Z0,
        rhs = rhs[i, ],
        ridge.grid = ridge.grid
      )[1L]
    } else {
      .np_inid_lp_predict_chunk(
        Mvals = M0,
        Zvals = Z0,
        rhs = rhs[i, ],
        ridge.grid = ridge.grid
      )[1L]
    }
    prep.progress <- .np_plot_progress_tick(state = prep.progress, done = i)
  }
  .np_plot_progress_end(prep.progress)
  prep.progress.active <- FALSE

  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  fill_chunk <- function(counts.chunk, start, stopi) {
    for (i in seq_len(neval)) {
      Mvals <- crossprod(counts.chunk, Mfeat[[i]])
      Zvals <- crossprod(counts.chunk, Zfeat[[i]])
      tmat[start:stopi, i] <<- if (p > 3L) {
        .np_inid_lp_predict_chunk_general(
          Mvals = Mvals,
          Zvals = Zvals,
          rhs = rhs[i, ],
          ridge.grid = ridge.grid
        )
      } else {
        .np_inid_lp_predict_chunk(
          Mvals = Mvals,
          Zvals = Zvals,
          rhs = rhs[i, ],
          ridge.grid = ridge.grid
        )
      }
    }
  }

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    fill_chunk(counts.chunk = counts.mat, start = 1L, stopi = B)
    progress <- .np_plot_progress_tick(state = progress, done = B, force = TRUE)
  } else {
    chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
    chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
    start <- 1L
    while (start <= B) {
      stopi <- min(B, start + chunk.controller$chunk.size - 1L)
      bsz <- stopi - start + 1L
      chunk.started <- .np_progress_now()
      counts.chunk <- if (!is.null(counts.drawer)) {
        .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
      } else {
        stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
      }
      fill_chunk(counts.chunk = counts.chunk, start = start, stopi = stopi)
      progress <- .np_plot_progress_tick(state = progress, done = stopi)
      chunk.controller <- .np_plot_progress_chunk_observe(
        controller = chunk.controller,
        bsz = bsz,
        elapsed.sec = .np_progress_now() - chunk.started
      )
      start <- stopi + 1L
    }
  }

  if (any(!is.finite(t0)) || any(!is.finite(tmat)))
    stop("smooth coefficient local-polynomial helper produced non-finite values")

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_scoef_exact <- function(txdat,
                                           ydat,
                                           tzdat,
                                           exdat,
                                           ezdat,
                                           bws,
                                           B,
                                           counts = NULL,
                                           counts.drawer = NULL,
                                           leave.one.out = FALSE,
                                           progress.label = NULL) {
  txdat <- toFrame(txdat)
  exdat <- toFrame(exdat)
  B <- as.integer(B)

  miss.z <- missing(tzdat) || is.null(tzdat)
  if (miss.z) {
    tzdat <- txdat
    ezdat <- exdat
  } else {
    tzdat <- toFrame(tzdat)
    ezdat <- toFrame(ezdat)
  }

  if (nrow(txdat) != nrow(tzdat))
    stop("smooth coefficient exact helper requires aligned txdat/tzdat rows")
  if (nrow(exdat) != nrow(ezdat))
    stop("smooth coefficient exact helper requires aligned exdat/ezdat rows")
  if (ncol(txdat) != ncol(exdat))
    stop("smooth coefficient exact helper requires matching txdat/exdat columns")
  if (nrow(txdat) < 1L || nrow(exdat) < 1L || B < 1L)
    stop("invalid smooth coefficient exact helper dimensions")
  if (length(ydat) != nrow(txdat))
    stop("length of ydat must match training rows in smooth coefficient exact helper")

  fit.fun <- function(tx.train, y.train, tz.train) {
    fit.args <- list(
      bws = bws,
      txdat = tx.train,
      tydat = y.train,
      exdat = exdat,
      iterate = FALSE,
      errors = FALSE,
      leave.one.out = leave.one.out
    )
    if (!miss.z) {
      fit.args$tzdat <- tz.train
      fit.args$ezdat <- ezdat
    }
    as.vector(do.call(.np_scoef_fit_internal, fit.args)$mean)
  }

  t0 <- fit.fun(tx.train = txdat, y.train = ydat, tz.train = tzdat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  n <- nrow(txdat)
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit.fun(
        tx.train = txdat[idx, , drop = FALSE],
        y.train = ydat[idx],
        tz.train = tzdat[idx, , drop = FALSE]
      )
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_scoef <- function(txdat,
                                     ydat,
                                     tzdat,
                                     exdat,
                                     ezdat,
                                     bws,
                                     B,
                                     counts = NULL,
                                     counts.drawer = NULL,
                                     leave.one.out = FALSE,
                                     progress.label = NULL,
                                     mode = c("exact", "frozen")) {
  mode <- match.arg(mode)

  z.source <- if (missing(tzdat) || is.null(tzdat)) txdat else tzdat
  spec <- .npscoef_canonical_spec(
    source = bws,
    zdat = z.source,
    where = "smooth coefficient inid helper"
  )

  if (!identical(spec$regtype.engine, "lc") &&
      (identical(mode, "frozen") || identical(bws$type, "fixed"))) {
    return(.np_inid_boot_from_scoef_localpoly_fixed(
      txdat = txdat,
      ydat = ydat,
      tzdat = tzdat,
      exdat = exdat,
      ezdat = ezdat,
      bws = bws,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      leave.one.out = leave.one.out,
      progress.label = progress.label
    ))
  }

  if (identical(mode, "frozen") || identical(bws$type, "fixed")) {
    return(.np_inid_boot_from_scoef_frozen(
      txdat = txdat,
      ydat = ydat,
      tzdat = tzdat,
      exdat = exdat,
      ezdat = ezdat,
      bws = bws,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      leave.one.out = leave.one.out,
      progress.label = progress.label
    ))
  }

  .np_inid_boot_from_scoef_exact(
    txdat = txdat,
    ydat = ydat,
    tzdat = tzdat,
    exdat = exdat,
    ezdat = ezdat,
    bws = bws,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    leave.one.out = leave.one.out,
    progress.label = progress.label
  )
}

.np_plreg_numeric_x_matrix <- function(txdat, exdat, bws) {
  txdat <- toFrame(txdat)
  exdat <- toFrame(exdat)

  p <- ncol(txdat)
  if (p < 1L)
    stop("plreg inid helper path requires at least one linear regressor")
  if (ncol(exdat) != p)
    stop("training/evaluation linear regressor dimensions do not match")

  x.train.num <- matrix(0.0, nrow = nrow(txdat), ncol = p)
  x.eval.num <- matrix(0.0, nrow = nrow(exdat), ncol = p)

  for (j in seq_len(p)) {
    if (is.factor(txdat[[j]])) {
      trj <- adjustLevels(txdat[, j, drop = FALSE], bws$bw[[j + 1L]]$ydati)
      evj <- adjustLevels(exdat[, j, drop = FALSE], bws$bw[[j + 1L]]$ydati, allowNewCells = TRUE)
      lev <- bws$bw[[j + 1L]]$ydati$all.dlev[[1L]]
      x.train.num[, j] <- lev[as.integer(trj[, 1L])]
      x.eval.num[, j] <- lev[as.integer(evj[, 1L])]
    } else {
      x.train.num[, j] <- as.double(txdat[[j]])
      x.eval.num[, j] <- as.double(exdat[[j]])
    }
  }

  list(train = x.train.num, eval = x.eval.num)
}

.np_plreg_weighted_coef <- function(X, y, w, ridge = 1.0e-12) {
  X <- as.matrix(X)
  y <- as.double(y)
  w <- as.double(w)
  if (nrow(X) != length(y) || length(w) != length(y))
    stop("weighted plreg solve dimension mismatch")

  w <- pmax(w, 0.0)

  XtWX <- crossprod(X, X * w)
  XtWy <- drop(crossprod(X, y * w))
  XtWy0 <- XtWy[1L]
  ridge.grid <- npRidgeSequenceFromBase(
    n.train = nrow(X),
    ridge.base = max(0.0, as.double(ridge)),
    cap = 1.0
  )

  for (ridge.try in ridge.grid) {
    A <- XtWX
    ridge <- ridge.try
    z <- XtWy
    if (ridge > 0)
      diag(A) <- diag(A) + ridge
    if (ridge > 0)
      z[1L] <- XtWy0 + ridge * XtWy0 / NZD(A[1L, 1L])
    beta <- tryCatch(
      drop(solve(A, matrix(z, ncol = 1L))),
      error = function(e) NULL
    )
    if (!is.null(beta) && all(is.finite(beta)))
      return(as.double(beta))
  }

  stop("plreg weighted solve failed")
}

.np_inid_boot_from_plreg_exact <- function(txdat,
                                           ydat,
                                           tzdat,
                                           exdat,
                                           ezdat,
                                           bws,
                                           B,
                                           counts = NULL,
                                           counts.drawer = NULL,
                                           ridge = 1.0e-12,
                                           progress.label = NULL) {
  txdat <- toFrame(txdat)
  tzdat <- toFrame(tzdat)
  exdat <- toFrame(exdat)
  ezdat <- toFrame(ezdat)
  B <- as.integer(B)

  n <- nrow(txdat)
  neval <- nrow(exdat)
  p <- ncol(txdat)
  if (nrow(tzdat) != n)
    stop("plreg inid helper path requires aligned txdat/tzdat rows")
  if (nrow(ezdat) != neval)
    stop("plreg inid helper path requires aligned exdat/ezdat rows")
  if (n < 1L || neval < 1L || p < 1L || B < 1L)
    stop("invalid plreg inid helper path dimensions")

  y.num <- if (is.factor(ydat)) {
    ty <- adjustLevels(data.frame(ydat), bws$bw$yzbw$ydati)
    bws$bw$yzbw$ydati$all.dlev[[1L]][as.integer(ty[, 1L])]
  } else {
    as.double(ydat)
  }
  if (length(y.num) != n)
    stop("length of ydat must match training rows")

  x.num <- .np_plreg_numeric_x_matrix(txdat = txdat, exdat = exdat, bws = bws)
  x.train.num <- x.num$train
  x.eval.num <- x.num$eval

  counts.mat <- if (!is.null(counts)) {
    .np_inid_counts_matrix(n = n, B = B, counts = counts)
  } else if (!is.null(counts.drawer)) {
    .np_inid_counts_matrix(n = n, B = B, counts = counts.drawer(1L, B))
  } else {
    .np_inid_counts_matrix(n = n, B = B)
  }

  y.train <- .np_inid_boot_from_regression(
    xdat = tzdat,
    exdat = tzdat,
    bws = bws$bw$yzbw,
    ydat = y.num,
    B = B,
    counts = counts.mat,
    counts.drawer = counts.drawer,
    ridge = ridge
  )
  y.eval <- .np_inid_boot_from_regression(
    xdat = tzdat,
    exdat = ezdat,
    bws = bws$bw$yzbw,
    ydat = y.num,
    B = B,
    counts = counts.mat,
    counts.drawer = counts.drawer,
    ridge = ridge
  )

  x.train <- vector("list", p)
  x.eval <- vector("list", p)
  for (j in seq_len(p)) {
    x.train[[j]] <- .np_inid_boot_from_regression(
      xdat = tzdat,
      exdat = tzdat,
      bws = bws$bw[[j + 1L]],
      ydat = x.train.num[, j],
      B = B,
      counts = counts.mat,
      counts.drawer = counts.drawer,
      ridge = ridge
    )
    x.eval[[j]] <- .np_inid_boot_from_regression(
      xdat = tzdat,
      exdat = ezdat,
      bws = bws$bw[[j + 1L]],
      ydat = x.train.num[, j],
      B = B,
      counts = counts.mat,
      counts.drawer = counts.drawer,
      ridge = ridge
    )
  }

  xres.train0 <- matrix(0.0, nrow = n, ncol = p)
  xres.eval0 <- matrix(0.0, nrow = neval, ncol = p)
  for (j in seq_len(p)) {
    xres.train0[, j] <- x.train.num[, j] - as.double(x.train[[j]]$t0)
    xres.eval0[, j] <- x.eval.num[, j] - as.double(x.eval[[j]]$t0)
  }
  yres0 <- y.num - as.double(y.train$t0)
  beta0 <- .np_plreg_weighted_coef(
    X = xres.train0,
    y = yres0,
    w = rep.int(1.0, n),
    ridge = ridge
  )
  t0 <- as.double(y.eval$t0) + as.vector(xres.eval0 %*% beta0)

  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  xres.train.b <- matrix(0.0, nrow = n, ncol = p)
  xres.eval.b <- matrix(0.0, nrow = neval, ncol = p)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  for (b in seq_len(B)) {
    for (j in seq_len(p)) {
      xres.train.b[, j] <- x.train.num[, j] - x.train[[j]]$t[b, ]
      xres.eval.b[, j] <- x.eval.num[, j] - x.eval[[j]]$t[b, ]
    }
    yres.b <- y.num - y.train$t[b, ]
    beta.b <- .np_plreg_weighted_coef(
      X = xres.train.b,
      y = yres.b,
      w = counts.mat[, b],
      ridge = ridge
    )
    tmat[b, ] <- y.eval$t[b, ] + as.vector(xres.eval.b %*% beta.b)
    progress <- .np_plot_progress_tick(state = progress, done = b)
  }

  if (any(!is.finite(t0)) || any(!is.finite(tmat)))
    stop("plreg inid helper path produced non-finite values")

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_plreg_frozen <- function(txdat,
                                            ydat,
                                            tzdat,
                                            exdat,
                                            ezdat,
                                            bws,
                                            B,
                                            counts = NULL,
                                            counts.drawer = NULL,
                                            ridge = 1.0e-12,
                                            progress.label = NULL) {
  txdat <- toFrame(txdat)
  tzdat <- toFrame(tzdat)
  exdat <- toFrame(exdat)
  ezdat <- toFrame(ezdat)

  n <- nrow(txdat)
  if (nrow(tzdat) != n)
    stop("plreg frozen helper path requires aligned txdat/tzdat rows")
  if (nrow(ezdat) != nrow(exdat))
    stop("plreg frozen helper path requires aligned exdat/ezdat rows")
  if (n < 1L || nrow(exdat) < 1L || ncol(txdat) < 1L || as.integer(B) < 1L)
    stop("invalid plreg frozen helper path dimensions")

  y.num <- if (is.factor(ydat)) {
    ty <- adjustLevels(data.frame(ydat), bws$bw$yzbw$ydati)
    bws$bw$yzbw$ydati$all.dlev[[1L]][as.integer(ty[, 1L])]
  } else {
    as.double(ydat)
  }
  if (length(y.num) != n)
    stop("length of ydat must match training rows")

  x.num <- .np_plreg_numeric_x_matrix(txdat = txdat, exdat = exdat, bws = bws)
  x.train.num <- x.num$train
  x.eval.num <- x.num$eval

  counts.mat <- if (!is.null(counts)) {
    .np_inid_counts_matrix(n = n, B = B, counts = counts)
  } else if (!is.null(counts.drawer)) {
    .np_inid_counts_matrix(n = n, B = B, counts = counts.drawer(1L, B))
  } else {
    .np_inid_counts_matrix(n = n, B = B)
  }

  y.train <- .np_inid_boot_from_reghat_frozen(
    xdat = tzdat,
    exdat = tzdat,
    bws = bws$bw$yzbw,
    ydat = y.num,
    B = B,
    counts = counts.mat
  )
  y.eval <- .np_inid_boot_from_reghat_frozen(
    xdat = tzdat,
    exdat = ezdat,
    bws = bws$bw$yzbw,
    ydat = y.num,
    B = B,
    counts = counts.mat
  )

  p <- ncol(txdat)
  x.train <- vector("list", p)
  x.eval <- vector("list", p)
  for (j in seq_len(p)) {
    x.train[[j]] <- .np_inid_boot_from_reghat_frozen(
      xdat = tzdat,
      exdat = tzdat,
      bws = bws$bw[[j + 1L]],
      ydat = x.train.num[, j],
      B = B,
      counts = counts.mat
    )
    x.eval[[j]] <- .np_inid_boot_from_reghat_frozen(
      xdat = tzdat,
      exdat = ezdat,
      bws = bws$bw[[j + 1L]],
      ydat = x.train.num[, j],
      B = B,
      counts = counts.mat
    )
  }

  xres.train0 <- matrix(0.0, nrow = n, ncol = p)
  xres.eval0 <- matrix(0.0, nrow = nrow(exdat), ncol = p)
  for (j in seq_len(p)) {
    xres.train0[, j] <- x.train.num[, j] - as.double(x.train[[j]]$t0)
    xres.eval0[, j] <- x.eval.num[, j] - as.double(x.eval[[j]]$t0)
  }
  yres0 <- y.num - as.double(y.train$t0)
  beta0 <- .np_plreg_weighted_coef(
    X = xres.train0,
    y = yres0,
    w = rep.int(1.0, n),
    ridge = ridge
  )
  t0 <- as.double(y.eval$t0) + as.vector(xres.eval0 %*% beta0)

  tmat <- matrix(NA_real_, nrow = B, ncol = nrow(exdat))
  xres.train.b <- matrix(0.0, nrow = n, ncol = p)
  xres.eval.b <- matrix(0.0, nrow = nrow(exdat), ncol = p)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  for (b in seq_len(B)) {
    for (j in seq_len(p)) {
      xres.train.b[, j] <- x.train.num[, j] - x.train[[j]]$t[b, ]
      xres.eval.b[, j] <- x.eval.num[, j] - x.eval[[j]]$t[b, ]
    }
    yres.b <- y.num - y.train$t[b, ]
    beta.b <- .np_plreg_weighted_coef(
      X = xres.train.b,
      y = yres.b,
      w = counts.mat[, b],
      ridge = ridge
    )
    tmat[b, ] <- y.eval$t[b, ] + as.vector(xres.eval.b %*% beta.b)
    progress <- .np_plot_progress_tick(state = progress, done = b)
  }

  if (any(!is.finite(t0)) || any(!is.finite(tmat)))
    stop("plreg frozen helper path produced non-finite values")

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_plreg <- function(txdat,
                                     ydat,
                                     tzdat,
                                     exdat,
                                     ezdat,
                                     bws,
                                     B,
                                     counts = NULL,
                                     counts.drawer = NULL,
                                     ridge = 1.0e-12,
                                     progress.label = NULL,
                                     mode = c("exact", "frozen")) {
  mode <- match.arg(mode)

  if (identical(mode, "frozen") && !identical(bws$type, "fixed")) {
    return(.np_inid_boot_from_plreg_frozen(
      txdat = txdat,
      ydat = ydat,
      tzdat = tzdat,
      exdat = exdat,
      ezdat = ezdat,
      bws = bws,
      B = B,
      counts = counts,
      counts.drawer = counts.drawer,
      ridge = ridge,
      progress.label = progress.label
    ))
  }

  .np_inid_boot_from_plreg_exact(
    txdat = txdat,
    ydat = ydat,
    tzdat = tzdat,
    exdat = exdat,
    ezdat = ezdat,
    bws = bws,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    ridge = ridge,
    progress.label = progress.label
  )
}

.np_boot_matrix_from_ksum <- function(ksum, B, nout, where = "ksum helper path") {
  if (is.null(dim(ksum))) {
    if (B == 1L && length(ksum) == nout)
      return(matrix(as.double(ksum), nrow = 1L))
    stop(sprintf("%s returned unexpected vector shape", where))
  }

  km <- as.matrix(ksum)
  if (nrow(km) == B && ncol(km) == nout)
    return(km)
  if (nrow(km) == nout && ncol(km) == B)
    return(t(km))
  if (B == 1L && length(km) == nout)
    return(matrix(as.double(km), nrow = 1L))

  stop(sprintf("%s returned unexpected matrix shape", where))
}

.np_ksum_unconditional_eval_exact <- function(xdat,
                                              exdat,
                                              bws,
                                              operator,
                                              weights = NULL,
                                              n.total = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  if (is.null(weights)) {
    weights <- matrix(1.0, nrow = nrow(xdat), ncol = 1L)
    n.total <- nrow(xdat)
  } else {
    weights <- matrix(as.double(weights), ncol = 1L)
    if (nrow(weights) != nrow(xdat))
      stop("exact unconditional ksum helper requires one weight per training row")
    if (is.null(n.total))
      n.total <- sum(weights)
  }
  ones <- matrix(1.0, nrow = nrow(xdat), ncol = 1L)
  as.numeric(npksum(
    txdat = xdat,
    tydat = ones,
    exdat = exdat,
    bws = bws,
    weights = weights,
    operator = operator,
    bandwidth.divide = TRUE
  )$ksum) / n.total
}

.np_make_kbandwidth_unconditional <- function(bws, xdat) {
  xdat <- toFrame(xdat)
  kbandwidth.numeric(
    bw = bws$bw,
    bwscaling = FALSE,
    # npksum helper constructors require raw bandwidths; bwscaling flags are
    # non-fit-defining here and are intentionally normalized to FALSE.
    bwtype = bws$type,
    ckertype = bws$ckertype,
    ckerorder = bws$ckerorder,
    ckerbound = bws$ckerbound,
    ckerlb = if (!is.null(bws$ckerlb)) bws$ckerlb else NULL,
    ckerub = if (!is.null(bws$ckerub)) bws$ckerub else NULL,
    ukertype = bws$ukertype,
    okertype = bws$okertype,
    nobs = nrow(xdat),
    xdati = untangle(xdat),
    xnames = names(xdat)
  )
}

.np_unconditional_exact_precomputed_kband_safe <- function(bws, n.train) {
  if (!identical(bws$type, "adaptive_nn"))
    return(TRUE)

  bw.max <- suppressWarnings(max(as.integer(bws$bw)))
  is.finite(bw.max) && !is.na(bw.max) && n.train >= bw.max
}

.np_operator_matrix_from_ksum <- function(ksum, nrow.out, ncol.out, where) {
  km <- as.matrix(ksum)

  if (nrow(km) == nrow.out && ncol(km) == ncol.out)
    return(km)
  if (nrow(km) == ncol.out && ncol(km) == nrow.out)
    return(t(km))

  stop(sprintf("%s returned unexpected operator shape", where))
}

.np_operator_kernel_weight_scale <- function(bws, operator, nvars, where) {
  if (!isa(bws, "kbandwidth"))
    bws <- kbandwidth(bws)

  operator <- as.character(operator)
  if (length(operator) == 1L)
    operator <- rep.int(operator, nvars)
  if (length(operator) != nvars)
    stop(sprintf("%s requires one operator per column", where))

  bw.scale <- 1.0
  if (bws$ncon > 0L) {
    con.ops <- operator[bws$icon]
    if (any(con.ops == "normal"))
      bw.scale <- prod(bws$bw[bws$icon][con.ops == "normal"])
  }

  list(bws = bws, scale = bw.scale, operator = operator)
}

.np_ksum_unconditional_operator_fixed <- function(xdat, exdat, bws, operator) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  op.info <- .np_operator_kernel_weight_scale(
    bws = bws,
    operator = operator,
    nvars = ncol(xdat),
    where = "direct unconditional kernel weights"
  )
  bws <- op.info$bws
  n <- nrow(xdat)
  kw <- .np_kernel_weights_direct(
    bws = bws,
    txdat = xdat,
    exdat = exdat,
    bandwidth.divide = TRUE,
    operator = op.info$operator
  )

  if (!is.matrix(kw))
    kw <- matrix(kw, nrow = n)
  if (nrow(kw) != n || ncol(kw) != nrow(exdat))
    stop("direct unconditional kernel weights returned unexpected operator shape")

  t(kw) / (n * op.info$scale)
}

.np_apply_operator_counts <- function(K, counts) {
  t(K %*% counts)
}

.np_plot_boot_from_frozen_operator <- function(H,
                                               B,
                                               counts = NULL,
                                               counts.drawer = NULL,
                                               progress.label = NULL) {
  H <- as.matrix(H)
  storage.mode(H) <- "double"
  B <- as.integer(B)
  neval <- nrow(H)
  n <- ncol(H)

  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid frozen bootstrap operator dimensions")

  t0 <- rowSums(H)

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    return(list(t = .np_apply_operator_counts(K = H, counts = counts.mat), t0 = t0))
  }

  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)

  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    tmat[start:stopi, ] <- .np_apply_operator_counts(K = H, counts = counts.chunk)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_hat_unconditional_frozen <- function(xdat,
                                                        exdat,
                                                        bws,
                                                        B,
                                                        operator,
                                                        counts = NULL,
                                                        counts.drawer = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)

  hat.fun <- switch(operator,
                    normal = npudenshat,
                    integral = npudisthat,
                    stop("unsupported unconditional frozen bootstrap operator"))

  H <- hat.fun(
    bws = bws,
    tdat = xdat,
    edat = exdat,
    output = "matrix"
  )

  .np_plot_boot_from_frozen_operator(
    H = H,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer
  )
}

.np_inid_boot_from_ksum_unconditional_exact <- function(xdat,
                                                        exdat,
                                                        bws,
                                                        B,
                                                        operator,
                                                        counts = NULL,
                                                        counts.drawer = NULL) {
  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  B <- as.integer(B)
  n <- nrow(xdat)
  neval <- nrow(exdat)

  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid unconditional exact bootstrap dimensions")

  fit_one <- function(x.train) {
    .np_ksum_unconditional_eval_exact(
      xdat = x.train,
      exdat = exdat,
      bws = bws,
      operator = operator
    )
  }

  t0 <- fit_one(x.train = xdat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit_one(x.train = xdat[idx, , drop = FALSE])
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_ksum_unconditional <- function(xdat,
                                                  exdat,
                                                  bws,
                                                  B,
                                                  operator,
                                                  counts = NULL,
                                                  counts.drawer = NULL) {
  if (!identical(bws$type, "fixed")) {
    return(.np_inid_boot_from_ksum_unconditional_exact(
      xdat = xdat,
      exdat = exdat,
      bws = bws,
      B = B,
      operator = operator,
      counts = counts,
      counts.drawer = counts.drawer
    ))
  }

  xdat <- toFrame(xdat)
  exdat <- toFrame(exdat)
  B <- as.integer(B)
  n <- nrow(xdat)
  neval <- nrow(exdat)

  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid unconditional inid bootstrap dimensions")

  K <- .np_ksum_unconditional_operator_fixed(
    xdat = xdat,
    exdat = exdat,
    bws = bws,
    operator = operator
  )
  t0 <- rowSums(K)

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    return(list(t = .np_apply_operator_counts(K = K, counts = counts.mat), t0 = t0))
  }

  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)

  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }
    tmat[start:stopi, ] <- .np_apply_operator_counts(K = K, counts = counts.chunk)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_con_inid_ksum_eligible <- function(bws) {
  isTRUE(identical(bws$cxkertype, bws$cykertype)) &&
    isTRUE(identical(bws$cxkerorder, bws$cykerorder)) &&
    isTRUE(identical(bws$uxkertype, bws$uykertype)) &&
    isTRUE(identical(bws$oxkertype, bws$oykertype))
}

.np_con_xregtype <- function(bws) {
  regtype <- if (is.null(bws$regtype.engine)) bws$regtype else bws$regtype.engine
  if (is.null(regtype)) "lc" else as.character(regtype)
}

.np_con_make_kbandwidth_x <- function(bws, xdat) {
  xdat <- toFrame(xdat)
  kbandwidth.numeric(
    bw = bws$xbw,
    bwscaling = FALSE,
    # npksum helper constructors require raw bandwidths; bwscaling flags are
    # non-fit-defining here and are intentionally normalized to FALSE.
    bwtype = bws$type,
    ckertype = bws$cxkertype,
    ckerorder = bws$cxkerorder,
    ckerbound = bws$cxkerbound,
    ckerlb = if (!is.null(bws$cxkerlb)) bws$cxkerlb else NULL,
    ckerub = if (!is.null(bws$cxkerub)) bws$cxkerub else NULL,
    ukertype = bws$uxkertype,
    okertype = bws$oxkertype,
    nobs = nrow(xdat),
    xdati = untangle(xdat),
    xnames = names(xdat)
  )
}

.np_con_make_kbandwidth_xy <- function(bws, xdat, ydat) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  xydat <- .np_bind_data_frames_fast(xdat, ydat)
  ckerlb <- c(if (is.null(bws$cxkerlb)) numeric(0) else bws$cxkerlb,
              if (is.null(bws$cykerlb)) numeric(0) else bws$cykerlb)
  ckerub <- c(if (is.null(bws$cxkerub)) numeric(0) else bws$cxkerub,
              if (is.null(bws$cykerub)) numeric(0) else bws$cykerub)
  joint.ckerbound <- if (identical(bws$cxkerbound, bws$cykerbound)) {
    bws$cxkerbound
  } else {
    "fixed"
  }

  kbandwidth.numeric(
    bw = c(bws$xbw, bws$ybw),
    bwscaling = FALSE,
    # npksum helper constructors require raw bandwidths; bwscaling flags are
    # non-fit-defining here and are intentionally normalized to FALSE.
    bwtype = bws$type,
    ckertype = bws$cxkertype,
    ckerorder = bws$cxkerorder,
    ckerbound = joint.ckerbound,
    ckerlb = if (length(ckerlb)) ckerlb else NULL,
    ckerub = if (length(ckerub)) ckerub else NULL,
    ukertype = bws$uxkertype,
    okertype = bws$oxkertype,
    nobs = nrow(xydat),
    xdati = untangle(xydat),
    xnames = names(xydat)
  )
}

.np_ksum_exact_state_build <- function(bws, exdat, operator) {
  exdat <- toFrame(exdat)
  if (!isa(bws, "kbandwidth"))
    bws <- kbandwidth(bws)

  operator <- as.character(operator)
  if (length(operator) == 1L)
    operator <- rep.int(operator, length(exdat))
  if (length(operator) != length(exdat))
    stop("exact ksum state requires one operator per evaluation column")
  if (!all(operator %in% names(ALL_OPERATORS)))
    stop("invalid operator specification for exact ksum state")

  uo.operators <- c("normal", "convolution", "integral")
  if (!all(operator[bws$iuno | bws$iord] %in% uo.operators))
    stop("unordered and ordered variables may only use normal, convolution, or integral operators")

  exdat <- adjustLevels(exdat, bws$xdati, allowNewCells = TRUE)
  npKernelBoundsCheckEval(exdat, bws$icon, bws$ckerlb, bws$ckerub, argprefix = "cker")

  exm <- toMatrix(exdat)
  bounds <- npKernelBoundsMarshal(bws$ckerlb[bws$icon], bws$ckerub[bws$icon])

  list(
    bws = bws,
    operator.num = ALL_OPERATORS[operator],
    euno = exm[, bws$iuno, drop = FALSE],
    eord = exm[, bws$iord, drop = FALSE],
    econ = exm[, bws$icon, drop = FALSE],
    enrow = nrow(exdat),
    bw = as.double(c(bws$bw[bws$icon], bws$bw[bws$iuno], bws$bw[bws$iord])),
    xmcv = as.double(bws$xmcv),
    pad.num = as.double(attr(bws$xmcv, "pad.num")),
    cker.lb = as.double(bounds$lb),
    cker.ub = as.double(bounds$ub)
  )
}

.np_ksum_eval_exact_state <- function(state, txdat, weights) {
  if (state$bws$nuno == 0L &&
      state$bws$nord == 0L &&
      is.matrix(txdat) &&
      typeof(txdat) == "double") {
    txm <- txdat
    tnrow <- nrow(txdat)
  } else if (state$bws$nuno == 0L &&
             state$bws$nord == 0L &&
             is.data.frame(txdat)) {
    txm <- data.matrix(txdat)
    tnrow <- nrow(txdat)
  } else {
    txdat <- adjustLevels(toFrame(txdat), state$bws$xdati, allowNewCells = TRUE)
    txm <- toMatrix(txdat)
    tnrow <- nrow(txdat)
  }
  if (is.matrix(weights) &&
      typeof(weights) == "double" &&
      ncol(weights) == 1L) {
    weights <- weights
  } else {
    weights <- matrix(as.double(weights), ncol = 1L)
  }

  if (nrow(weights) != tnrow)
    stop("exact ksum state apply requires one weight per training row")

  myopti <- list(
    num_obs_train = tnrow,
    num_obs_eval = state$enrow,
    num_uno = state$bws$nuno,
    num_ord = state$bws$nord,
    num_con = state$bws$ncon,
    int_LARGE_SF = SF_ARB,
    BANDWIDTH_reg_extern = switch(state$bws$type,
      fixed = BW_FIXED,
      generalized_nn = BW_GEN_NN,
      adaptive_nn = BW_ADAP_NN
    ),
    int_MINIMIZE_IO = if (isTRUE(getOption("np.messages"))) IO_MIN_FALSE else IO_MIN_TRUE,
    kerneval = switch(state$bws$ckertype,
      gaussian = CKER_GAUSS + state$bws$ckerorder / 2 - 1,
      epanechnikov = CKER_EPAN + state$bws$ckerorder / 2 - 1,
      uniform = CKER_UNI,
      "truncated gaussian" = CKER_TGAUSS
    ),
    ukerneval = switch(state$bws$ukertype,
      aitchisonaitken = UKER_AIT,
      liracine = UKER_LR
    ),
    okerneval = switch(state$bws$okertype,
      wangvanryzin = OKER_WANG,
      liracine = OKER_LR,
      nliracine = OKER_NLR,
      racineliyan = OKER_RLY
    ),
    miss.ex = FALSE,
    leave.one.out = FALSE,
    bandwidth.divide = TRUE,
    mcv.numRow = attr(state$bws$xmcv, "num.row"),
    wncol = 1L,
    yncol = 1L,
    int_do_tree = if (isTRUE(getOption("np.tree"))) DO_TREE_YES else DO_TREE_NO,
    return.kernel.weights = FALSE,
    permutation.operator = PERMUTATION_OPERATORS[["none"]],
    compute.score = FALSE,
    compute.ocg = FALSE
  )

  asDouble <- function(data) {
    if (is.null(data)) {
      as.double(0.0)
    } else if (typeof(data) == "double") {
      data
    } else {
      as.double(data)
    }
  }

  .Call(
    "C_np_kernelsum",
    asDouble(txm[, state$bws$iuno, drop = FALSE]),
    asDouble(txm[, state$bws$iord, drop = FALSE]),
    asDouble(txm[, state$bws$icon, drop = FALSE]),
    as.double(matrix(1.0, nrow = tnrow, ncol = 1L)),
    weights,
    asDouble(state$euno),
    asDouble(state$eord),
    asDouble(state$econ),
    state$bw,
    state$xmcv,
    state$pad.num,
    as.integer(c(
      state$operator.num[state$bws$icon],
      state$operator.num[state$bws$iuno],
      state$operator.num[state$bws$iord]
    )),
    as.integer(myopti),
    as.double(1.0),
    as.integer(state$enrow),
    as.integer(0L),
    as.integer(0L),
    state$cker.lb,
    state$cker.ub,
    PACKAGE = "np"
  )[[1L]]
}

.np_ksum_conditional_eval_exact <- function(xdat,
                                            ydat,
                                            exdat,
                                            eydat,
                                            kbx,
                                            kbxy,
                                            cdf,
                                            weights = NULL,
                                            n.total = NULL) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  xop <- rep.int("normal", ncol(xdat))
  yop <- rep.int(if (cdf) "integral" else "normal", ncol(ydat))
  xyop <- c(xop, yop)
  if (is.null(weights)) {
    weights <- matrix(1.0, nrow = nrow(xdat), ncol = 1L)
    n.total <- nrow(xdat)
  } else {
    weights <- matrix(as.double(weights), ncol = 1L)
    if (nrow(weights) != nrow(xdat))
      stop("exact conditional ksum helper requires one weight per training row")
    if (is.null(n.total))
      n.total <- sum(weights)
  }
  ones <- matrix(1.0, nrow = nrow(xdat), ncol = 1L)
  xydat <- .np_bind_data_frames_fast(xdat, ydat)
  exydat <- .np_bind_data_frames_fast(exdat, eydat)

  den <- as.numeric(npksum(
    txdat = xdat,
    tydat = ones,
    exdat = exdat,
    bws = kbx,
    weights = weights,
    operator = xop,
    bandwidth.divide = TRUE
  )$ksum) / n.total
  num <- as.numeric(npksum(
    txdat = xydat,
    tydat = ones,
    exdat = exydat,
    bws = kbxy,
    weights = weights,
    operator = xyop,
    bandwidth.divide = TRUE
  )$ksum) / n.total

  num / pmax(den, .Machine$double.eps)
}

.np_conditional_exact_fit_or_stop <- function(fit.expr,
                                              bws,
                                              x.train,
                                              y.train) {
  tryCatch(
    fit.expr(),
    error = function(e) {
      if (identical(bws$type, "adaptive_nn")) {
        stop(
          sprintf(
            "adaptive conditional exact bootstrap resample is invalid for this active support (n.active=%d, x.unique=%d, y.unique=%d): %s",
            nrow(x.train),
            nrow(unique(toFrame(x.train))),
            nrow(unique(toFrame(y.train))),
            conditionMessage(e)
          ),
          call. = FALSE
        )
      }
      stop(e)
    }
  )
}

.np_ksum_conditional_operator_fixed <- function(xdat,
                                                ydat,
                                                exdat,
                                                eydat,
                                                bws,
                                                cdf) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  n <- nrow(xdat)

  kbx <- .np_con_make_kbandwidth_x(bws = bws, xdat = xdat)
  kbxy <- .np_con_make_kbandwidth_xy(bws = bws, xdat = xdat, ydat = ydat)
  xop <- rep.int("normal", ncol(xdat))
  yop <- rep.int(if (cdf) "integral" else "normal", ncol(ydat))
  xyop <- c(xop, yop)
  den.info <- .np_operator_kernel_weight_scale(
    bws = kbx,
    operator = xop,
    nvars = ncol(xdat),
    where = "direct conditional denominator kernel weights"
  )
  num.info <- .np_operator_kernel_weight_scale(
    bws = kbxy,
    operator = xyop,
    nvars = ncol(xdat) + ncol(ydat),
    where = "direct conditional numerator kernel weights"
  )
  Kden <- .np_kernel_weights_direct(
    bws = den.info$bws,
    txdat = xdat,
    exdat = exdat,
    bandwidth.divide = TRUE,
    operator = den.info$operator
  )
  Knum <- .np_kernel_weights_direct(
    bws = num.info$bws,
    txdat = data.frame(xdat, ydat),
    exdat = data.frame(exdat, eydat),
    bandwidth.divide = TRUE,
    operator = num.info$operator
  )

  if (!is.matrix(Kden))
    Kden <- matrix(Kden, nrow = n)
  if (!is.matrix(Knum))
    Knum <- matrix(Knum, nrow = n)
  if (nrow(Kden) != n || ncol(Kden) != nrow(exdat))
    stop("direct conditional denominator kernel weights returned unexpected operator shape")
  if (nrow(Knum) != n || ncol(Knum) != nrow(exdat))
    stop("direct conditional numerator kernel weights returned unexpected operator shape")

  list(
    den = t(Kden) / (n * den.info$scale),
    num = t(Knum) / (n * num.info$scale)
  )
}

.np_plot_exact_row_groups <- function(dat) {
  dat <- toFrame(dat)
  n <- nrow(dat)
  if (n < 1L)
    stop("row grouping requires at least one row")

  key_cols <- lapply(dat, function(col) {
    if (is.factor(col)) {
      paste0("factor:", as.integer(col))
    } else if (is.character(col)) {
      paste0("character:", encodeString(col, quote = "\""))
    } else if (is.logical(col)) {
      paste0("logical:", ifelse(is.na(col), "NA", ifelse(col, "TRUE", "FALSE")))
    } else if (inherits(col, "POSIXt")) {
      paste0("POSIXt:", format(col, tz = "UTC", usetz = TRUE, digits = 17))
    } else if (inherits(col, "Date")) {
      paste0("Date:", as.character(col))
    } else {
      paste0(typeof(col), ":", format(col, digits = 17, scientific = FALSE, trim = TRUE))
    }
  })
  keys <- do.call(paste, c(key_cols, sep = "\r"))
  first <- which(!duplicated(keys))
  index <- match(keys, keys[first])
  groups <- split(seq_len(n), index)

  list(
    unique = dat[first, , drop = FALSE],
    first = first,
    index = index,
    groups = groups
  )
}

.np_inid_boot_from_conditional_localpoly_fixed_rowwise <- function(xdat,
                                                                   ydat,
                                                                   exdat,
                                                                   eydat,
                                                                   bws,
                                                                   B,
                                                                   cdf,
                                                                   counts = NULL,
                                                                   counts.drawer = NULL) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  B <- as.integer(B)

  n <- nrow(xdat)
  neval <- nrow(exdat)
  if (nrow(ydat) != n || nrow(eydat) != neval)
    stop("conditional localpoly bootstrap helper requires aligned x/y training and evaluation rows")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid conditional localpoly bootstrap dimensions")
  if (!identical(bws$type, "fixed"))
    stop("conditional localpoly bootstrap helper supports only fixed bandwidths")

  xbw <- .npcdhat_make_xbw(bws = bws, txdat = xdat)
  ybw <- .npcdhat_make_ybw(bws = bws, tydat = ydat)
  Gy <- .npcdhat_make_kernel_matrix(
    kbw = ybw,
    txdat = ydat,
    exdat = eydat,
    operator = rep.int(if (cdf) "integral" else "normal", ncol(ydat))
  )
  Gy <- .np_operator_matrix_from_ksum(
    ksum = Gy,
    nrow.out = neval,
    ncol.out = n,
    where = "conditional localpoly y-operator"
  )

  counts.mat <- if (!is.null(counts)) {
    .np_inid_counts_matrix(n = n, B = B, counts = counts)
  } else if (!is.null(counts.drawer)) {
    .np_inid_counts_matrix(n = n, B = B, counts = counts.drawer(1L, B))
  } else {
    .np_inid_counts_matrix(n = n, B = B)
  }

  t0 <- numeric(neval)
  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  progress <- .np_plot_progress_begin(total = neval, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  old.progress <- getOption("np.plot.progress", TRUE)
  options(np.plot.progress = FALSE)
  on.exit({
    options(np.plot.progress = old.progress)
  }, add = TRUE)

  # Exact duplicate-sample refits for fixed conditional ll/lp reduce to
  # reusing the fixed x-side local-polynomial bootstrap helper on y-kernel
  # pseudo-responses, one evaluation row at a time.
  for (i in seq_len(neval)) {
    out <- .np_inid_boot_from_regression(
      xdat = xdat,
      exdat = exdat[i, , drop = FALSE],
      bws = xbw,
      ydat = as.numeric(Gy[i, ]),
      B = B,
      counts = counts.mat
    )
    t0[i] <- out$t0[1L]
    tmat[, i] <- out$t[, 1L]
    progress <- .np_plot_progress_tick(state = progress, done = i)
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_conditional_localpoly_fixed_counts <- function(xdat,
                                                                  ydat,
                                                                  exdat,
                                                                  eydat,
                                                                  bws,
                                                                  B,
                                                                  cdf,
                                                                  counts) {
  state <- .np_inid_boot_from_conditional_localpoly_fixed_precompute(
    xdat = xdat,
    ydat = ydat,
    exdat = exdat,
    eydat = eydat,
    bws = bws,
    cdf = cdf
  )
  counts.mat <- .np_inid_counts_matrix(n = state$n, B = B, counts = counts)
  t0 <- numeric(state$neval)
  tmat <- matrix(NA_real_, nrow = B, ncol = state$neval)

  for (i in seq_len(state$ngroups)) {
    feat <- .np_inid_boot_from_conditional_localpoly_fixed_group_features(state = state, i = i)
    t0[feat$rows] <- .np_inid_boot_from_conditional_localpoly_fixed_t0(state = state, feat = feat)
    tmat[, feat$rows] <- .np_inid_boot_from_conditional_localpoly_fixed_chunk(
      state = state,
      feat = feat,
      counts.chunk = counts.mat
    )
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_conditional_localpoly_fixed_precompute <- function(xdat,
                                                                      ydat,
                                                                      exdat,
                                                                      eydat,
                                                                      bws,
                                                                      cdf) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)

  n <- nrow(xdat)
  neval <- nrow(exdat)
  if (nrow(ydat) != n || nrow(eydat) != neval)
    stop("conditional localpoly bootstrap helper requires aligned x/y training and evaluation rows")
  if (n < 1L || neval < 1L)
    stop("invalid conditional localpoly bootstrap dimensions")
  if (!identical(bws$type, "fixed"))
    stop("conditional localpoly bootstrap helper supports only fixed bandwidths")

  xbw <- .npcdhat_make_xbw(bws = bws, txdat = xdat)
  ybw <- .npcdhat_make_ybw(bws = bws, tydat = ydat)
  ex.groups <- .np_plot_exact_row_groups(exdat)
  exdat.unique <- ex.groups$unique
  ngroups <- nrow(exdat.unique)
  Gy <- .npcdhat_make_kernel_matrix(
    kbw = ybw,
    txdat = ydat,
    exdat = eydat,
    operator = rep.int(if (cdf) "integral" else "normal", ncol(ydat))
  )
  Gy <- .np_operator_matrix_from_ksum(
    ksum = Gy,
    nrow.out = neval,
    ncol.out = n,
    where = "conditional localpoly y-operator"
  )

  regtype <- if (is.null(xbw$regtype)) "lc" else as.character(xbw$regtype)
  if (identical(regtype, "lc"))
    stop("conditional localpoly fixed counts helper requires regtype='ll' or 'lp'")

  ncon <- xbw$ncon
  degree <- if (identical(regtype, "ll")) {
    rep.int(1L, ncon)
  } else {
    npValidateGlpDegree(
      regtype = "lp",
      degree = xbw$degree,
      ncon = ncon
    )
  }

  basis <- npValidateLpBasis(
    regtype = "lp",
    basis = if (is.null(xbw$basis)) "glp" else xbw$basis
  )
  bernstein.basis <- npValidateGlpBernstein(
    regtype = "lp",
    bernstein.basis = isTRUE(xbw$bernstein.basis)
  )

  kw <- .np_kernel_weights_direct(
    bws = xbw,
    txdat = xdat,
    exdat = exdat.unique,
    bandwidth.divide = TRUE,
    leave.one.out = FALSE,
    operator = rep.int("normal", ncol(xdat))
  )
  if (!is.matrix(kw))
    kw <- matrix(kw, nrow = n)
  if (nrow(kw) != n || ncol(kw) != ngroups)
    stop("conditional localpoly x-kernel-weight matrix shape mismatch")

  W <- W.lp(
    xdat = xdat,
    degree = degree,
    basis = basis,
    bernstein.basis = bernstein.basis
  )
  W.eval <- W.lp(
    xdat = xdat,
    exdat = exdat.unique,
    degree = degree,
    basis = basis,
    bernstein.basis = bernstein.basis
  )
  W <- as.matrix(W)
  W.eval <- as.matrix(W.eval)

  if (nrow(W) != n || nrow(W.eval) != ngroups || ncol(W.eval) != ncol(W))
    stop("conditional localpoly fixed moment design matrix shape mismatch")

  p <- ncol(W)
  mcols <- p * (p + 1L) / 2L
  ridge.grid <- npRidgeSequenceFromBase(n.train = n, ridge.base = 1.0e-12, cap = 1.0)

  list(
    n = n,
    neval = neval,
    ngroups = ngroups,
    groups = ex.groups$groups,
    exdat.unique = exdat.unique,
    Gy = Gy,
    kw = kw,
    W = W,
    W.eval = W.eval,
    p = p,
    mcols = mcols,
    ridge.grid = ridge.grid
  )
}

.np_inid_boot_from_conditional_localpoly_fixed_group_features <- function(state, i) {
  rows <- state$groups[[i]]
  k <- as.double(state$kw[, i])
  WK <- state$W * k
  Gy.group <- state$Gy[rows, , drop = FALSE]

  Mfeat <- matrix(0.0, nrow = state$n, ncol = state$mcols)
  idx <- 1L
  for (a in seq_len(state$p)) {
    for (bb in a:state$p) {
      Mfeat[, idx] <- WK[, a] * state$W[, bb]
      idx <- idx + 1L
    }
  }

  Zops <- vector("list", state$p)
  for (a in seq_len(state$p))
    Zops[[a]] <- t(sweep(Gy.group, 2L, WK[, a], "*"))

  list(
    rows = rows,
    Gy = Gy.group,
    WK = WK,
    Mfeat = Mfeat,
    Zops = Zops,
    rhs = state$W.eval[i, ]
  )
}

.np_inid_boot_from_conditional_localpoly_fixed_t0 <- function(state, feat) {
  A0 <- .np_inid_lp_unpack_sym_row(mrow = colSums(feat$Mfeat), p = state$p)
  Z0 <- t(feat$Gy %*% feat$WK)
  .np_inid_lp_predict_row_multi(
    A = A0,
    Z = Z0,
    rhs = feat$rhs,
    ridge.grid = state$ridge.grid
  )
}

.np_inid_boot_from_conditional_localpoly_fixed_chunk <- function(state,
                                                                 feat,
                                                                 counts.chunk) {
  Mvals <- crossprod(counts.chunk, feat$Mfeat)
  Zmats <- lapply(feat$Zops, function(zop) crossprod(counts.chunk, zop))

  .np_inid_lp_predict_chunk_multi(
    Mvals = Mvals,
    Zmats = Zmats,
    rhs = feat$rhs,
    ridge.grid = state$ridge.grid
  )
}

.np_inid_boot_from_conditional_localpoly_fixed_core <- function(state,
                                                                B,
                                                                counts = NULL,
                                                                counts.drawer = NULL,
                                                                progress.label = NULL) {
  B <- as.integer(B)
  feat.list <- lapply(seq_len(state$ngroups), function(i) {
    .np_inid_boot_from_conditional_localpoly_fixed_group_features(state = state, i = i)
  })

  t0 <- numeric(state$neval)
  for (feat in feat.list)
    t0[feat$rows] <- .np_inid_boot_from_conditional_localpoly_fixed_t0(state = state, feat = feat)

  tmat <- matrix(NA_real_, nrow = B, ncol = state$neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  fill_chunk <- function(counts.chunk, start, stopi) {
    for (feat in feat.list) {
      tmat[start:stopi, feat$rows] <<- .np_inid_boot_from_conditional_localpoly_fixed_chunk(
        state = state,
        feat = feat,
        counts.chunk = counts.chunk
      )
    }
  }

  counts.mat <- if (!is.null(counts)) {
    .np_inid_counts_matrix(n = state$n, B = B, counts = counts)
  } else {
    NULL
  }

  chunk.size <- .np_inid_chunk_size(n = state$n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = state$n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      .np_inid_counts_matrix(n = state$n, B = bsz)
    }
    fill_chunk(counts.chunk = counts.chunk, start = start, stopi = stopi)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_conditional_localpoly_fixed <- function(xdat,
                                                           ydat,
                                                           exdat,
                                                           eydat,
                                                           bws,
                                                           B,
                                                           cdf,
                                                           counts = NULL,
                                                           counts.drawer = NULL,
                                                           progress.label = NULL) {
  state <- .np_inid_boot_from_conditional_localpoly_fixed_precompute(
    xdat = xdat,
    ydat = ydat,
    exdat = exdat,
    eydat = eydat,
    bws = bws,
    cdf = cdf
  )

  .np_inid_boot_from_conditional_localpoly_fixed_core(
    state = state,
    B = B,
    counts = counts,
    counts.drawer = counts.drawer,
    progress.label = progress.label
  )
}

.np_inid_boot_from_ksum_conditional_exact <- function(xdat,
                                                      ydat,
                                                      exdat,
                                                      eydat,
                                                      bws,
                                                      B,
                                                      cdf,
                                                      counts = NULL,
                                                      counts.drawer = NULL,
                                                      progress.label = NULL) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (nrow(ydat) != n || nrow(exdat) != nrow(eydat))
    stop("conditional exact bootstrap helper requires aligned x/y training and evaluation rows")
  if (n < 1L || nrow(exdat) < 1L || B < 1L)
    stop("invalid conditional exact bootstrap dimensions")
  if (!.np_con_inid_ksum_eligible(bws))
    return(NULL)

  fit_one <- function(x.train, y.train) {
    kbx <- tryCatch(.np_con_make_kbandwidth_x(bws = bws, xdat = x.train),
                    error = function(e) NULL)
    kbxy <- tryCatch(.np_con_make_kbandwidth_xy(bws = bws, xdat = x.train, ydat = y.train),
                     error = function(e) NULL)
    if (is.null(kbx) || is.null(kbxy))
      return(NULL)

    fit.expr <- function() {
      .np_ksum_conditional_eval_exact(
        xdat = x.train,
        ydat = y.train,
        exdat = exdat,
        eydat = eydat,
        kbx = kbx,
        kbxy = kbxy,
        cdf = cdf
      )
    }

    if (identical(bws$type, "adaptive_nn")) {
      return(.np_conditional_exact_fit_or_stop(
        fit.expr = fit.expr,
        bws = bws,
        x.train = x.train,
        y.train = y.train
      ))
    }

    fit.expr()
  }

  t0 <- fit_one(x.train = xdat, y.train = ydat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit_one(
        x.train = xdat[idx, , drop = FALSE],
        y.train = ydat[idx, , drop = FALSE]
      )
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_ksum_conditional <- function(xdat,
                                                ydat,
                                                exdat,
                                                eydat,
                                                bws,
                                                B,
                                                cdf,
                                                counts = NULL,
                                                counts.drawer = NULL,
                                                progress.label = NULL) {
  regtype <- .np_con_xregtype(bws)

  if (!identical(bws$type, "fixed")) {
    return(.np_inid_boot_from_ksum_conditional_exact(
      xdat = xdat,
      ydat = ydat,
      exdat = exdat,
      eydat = eydat,
      bws = bws,
      B = B,
      cdf = cdf,
      counts = counts,
      counts.drawer = counts.drawer,
      progress.label = progress.label
    ))
  }

  if (!identical(regtype, "lc")) {
    return(.np_inid_boot_from_conditional_localpoly_fixed(
      xdat = xdat,
      ydat = ydat,
      exdat = exdat,
      eydat = eydat,
      bws = bws,
      B = B,
      cdf = cdf,
      counts = counts,
      counts.drawer = counts.drawer,
      progress.label = progress.label
    ))
  }

  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  B <- as.integer(B)
  n <- nrow(xdat)
  neval <- nrow(exdat)

  if (nrow(ydat) != n || nrow(eydat) != neval)
    stop("conditional inid helper path requires aligned x/y training and evaluation rows")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid conditional inid bootstrap dimensions")
  if (!.np_con_inid_ksum_eligible(bws))
    return(NULL)

  ops <- tryCatch(
    .np_ksum_conditional_operator_fixed(
      xdat = xdat,
      ydat = ydat,
      exdat = exdat,
      eydat = eydat,
      bws = bws,
      cdf = cdf
    ),
    error = function(e) NULL
  )
  if (is.null(ops))
    return(NULL)
  t0 <- rowSums(ops$num) / pmax(rowSums(ops$den), .Machine$double.eps)

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    den <- t(ops$den %*% counts.mat)
    num <- t(ops$num %*% counts.mat)
    return(list(t = num / pmax(den, .Machine$double.eps), t0 = t0))
  }

  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)

  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }
    den <- t(ops$den %*% counts.chunk)
    num <- t(ops$num %*% counts.chunk)
    tmat[start:stopi, ] <- num / pmax(den, .Machine$double.eps)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_hat_conditional_frozen <- function(xdat,
                                                      ydat,
                                                      exdat,
                                                      eydat,
                                                      bws,
                                                      B,
                                                      cdf,
                                                      counts = NULL,
                                                      counts.drawer = NULL,
                                                      progress.label = NULL) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  B <- as.integer(B)
  n <- nrow(xdat)
  neval <- nrow(exdat)

  if (nrow(ydat) != n || nrow(eydat) != neval)
    stop("conditional frozen bootstrap helper requires aligned x/y training and evaluation rows")
  if (n < 1L || neval < 1L || B < 1L)
    stop("invalid conditional frozen bootstrap dimensions")

  operator <- if (isTRUE(cdf)) "integral" else "normal"
  xkbw <- .npcdhat_make_xkbw(bws = bws, txdat = xdat)
  ykbw <- .npcdhat_make_ybw(bws = bws, tydat = ydat)
  Kx <- .npcdhat_make_kernel_matrix(
    kbw = xkbw,
    txdat = xdat,
    exdat = exdat,
    operator = rep.int("normal", ncol(xdat))
  )
  Ky <- .npcdhat_make_kernel_matrix(
    kbw = ykbw,
    txdat = ydat,
    exdat = eydat,
    operator = rep.int(operator, ncol(ydat))
  )

  den.op <- Kx / n
  num.op <- (Kx * Ky) / n
  t0 <- rowSums(num.op) / pmax(rowSums(den.op), .Machine$double.eps)

  if (!is.null(counts)) {
    counts.mat <- .np_inid_counts_matrix(n = n, B = B, counts = counts)
    den <- t(den.op %*% counts.mat)
    num <- t(num.op %*% counts.mat)
    return(list(t = num / pmax(den, .Machine$double.eps), t0 = t0))
  }

  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  tmat <- matrix(NA_real_, nrow = B, ncol = neval)
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)

  start <- 1L
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    den <- t(den.op %*% counts.chunk)
    num <- t(num.op %*% counts.chunk)
    tmat[start:stopi, ] <- num / pmax(den, .Machine$double.eps)
    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

gen.label = function(label, altlabel){
  paste(if (is.null(label)) altlabel else label)
}

gen.tflabel = function(condition, tlabel, flabel){
  paste(if (isTRUE(condition)) tlabel else flabel)
}

draw.error.bands = function(ex, ely, ehy, lty = 2, col = par("col")){
  lines(ex,ely,lty=lty,col=col)
  lines(ex,ehy,lty=lty,col=col)
}

draw.error.bars = function(ex, ely, ehy, hbar = TRUE, hbarscale = 0.3, lty = 2, col = par("col")){
  yy = double(3*length(ex))
  jj = seq_along(ex)*3

  yy[jj-2] = ely
  yy[jj-1] = ehy
  yy[jj] = NA
  
  xx = double(3*length(ex))
  xx[jj-2] = ex
  xx[jj-1] = ex
  xx[jj] = NA

  lines(xx,yy,lty=lty,col=col)

  if (hbar){
    ## hbars look silly if they are too wide in relation to their height
    ## this only matters in the limit of few points, since that is when
    ## hbardist may get relatively large

    golden = (1+sqrt(5))/2
    hbardist = abs(max(ex) - min(ex))/length(ex)*hbarscale

    yg = abs(yy[jj-2]-yy[jj-1])/golden
    htest = (hbardist >= yg)
    
    hdelta = pmin(yg, hbardist)/2
    xx[jj-2] = ex - hdelta
    xx[jj-1] = ex + hdelta
    
    ty = yy[jj-1]
    yy[jj-1] = yy[jj-2]

    lines(xx,yy,col=col)

    yy[jj-2] = ty
    yy[jj-1] = ty

    lines(xx,yy,col=col)
  }
}

draw.errors =
  function(ex, ely, ehy,
           plot.errors.style,
           plot.errors.bar,
           plot.errors.bar.num,
           lty,
           col = par("col")){
    if (plot.errors.style == "bar"){
      ei = seq(1,length(ex),length.out = min(length(ex),plot.errors.bar.num))
      draw.error.bars(ex = ex[ei],
                      ely = ely[ei],
                      ehy = ehy[ei],
                      hbar = (plot.errors.bar == "I"),
                      lty = lty,
                      col = col)
    } else if (plot.errors.style == "band") {
      draw.error.bands(ex = ex,
                       ely = ely,
                       ehy = ehy,
                       lty = lty,
                       col = col)
    }
  }

draw.all.error.types <- function(ex, center, all.err,
                                 plot.errors.style = "band",
                                 plot.errors.bar = "|",
                                 plot.errors.bar.num = min(length(ex), 25),
                                 lty = 2, add.legend = TRUE, legend.loc = "topleft",
                                 xi.factor = FALSE){
  if (is.null(all.err)) return(invisible(NULL))

  if (xi.factor) {
    plot.errors.style <- "bar"
    plot.errors.bar <- "I"
  }

  draw_one <- function(err, col) {
    if (is.null(err)) return(invisible(NULL))
    lower <- center - err[,1]
    upper <- center + err[,2]
    good <- complete.cases(ex, lower, upper)
    if (!any(good)) return(invisible(NULL))
    draw.errors(ex = ex[good], ely = lower[good], ehy = upper[good],
                plot.errors.style = plot.errors.style,
                plot.errors.bar = plot.errors.bar,
                plot.errors.bar.num = plot.errors.bar.num,
                lty = lty, col = col)
  }

  band.cols <- .np_plot_all_band_colors()

  draw_one(all.err$pointwise, band.cols[["pointwise"]])
  draw_one(all.err$simultaneous, band.cols[["simultaneous"]])
  draw_one(all.err$bonferroni, band.cols[["bonferroni"]])

  if (add.legend) {
    legend(legend.loc,
           legend = c("Pointwise","Simultaneous","Bonferroni"),
           lty = 2,
           col = unname(band.cols[c("pointwise", "simultaneous", "bonferroni")]),
           lwd = 2,
           bty = "n")
  }
}

plotFactor <- function(f, y, ...){
  dot.args <- list(...)
  dot.names <- names(dot.args)
  has.user.lty <- !is.null(dot.names) && any(dot.names == "lty")
  is.fac <- is.factor(f) || is.ordered(f)
  has.user.xaxt <- !is.null(dot.names) && any(dot.names == "xaxt")
  has.user.xlim <- !is.null(dot.names) && any(dot.names == "xlim")
  add.axis <- is.fac && !has.user.xaxt
  x.pos <- if (is.fac) as.numeric(f) else f

  base.args <- c(list(x = x.pos, y = y), dot.args)
  if (add.axis)
    base.args$xaxt <- "n"
  if (is.fac && !has.user.xlim)
    base.args$xlim <- c(0.5, length(levels(f)) + 0.5)
  if (!has.user.lty)
    base.args$lty <- "blank"
  do.call(graphics::plot.default, base.args)
  if (add.axis)
    axis(1, at = seq_along(levels(f)), labels = levels(f))

  l.f = rep(f, each=3)
  l.f[3*seq_along(f)] = NA

  l.y = unlist(lapply(y, function (p) { c(0,p,NA) }))

  line.args <- list(x = l.f, y = l.y, lty = 2)
  if (!is.null(dot.args$col)) line.args$col <- dot.args$col
  if (!is.null(dot.args$lty)) line.args$lty <- dot.args$lty
  if (!is.null(dot.args$lwd)) line.args$lwd <- dot.args$lwd
  do.call(lines, line.args)

  point.args <- list(x = f, y = y)
  if (!is.null(dot.args$col)) point.args$col <- dot.args$col
  if (!is.null(dot.args$pch)) point.args$pch <- dot.args$pch
  if (!is.null(dot.args$cex)) point.args$cex <- dot.args$cex
  if (!is.null(dot.args$bg)) point.args$bg <- dot.args$bg
  do.call(points, point.args)
}

.np_plot_panel_fun <- function(plot.bootstrap, plot.bxp) {
  if (plot.bootstrap && plot.bxp) bxp else plotFactor
}

.np_plot_overlay_enabled <- function(plot.data.overlay,
                                    plot.behavior,
                                    gradients = FALSE,
                                    coef = FALSE,
                                    plot.data.overlay.missing = FALSE) {
  if (!isTRUE(plot.data.overlay))
    return(FALSE)
  if (identical(plot.behavior, "data"))
    return(FALSE)
  if (isTRUE(gradients)) {
    if (!isTRUE(plot.data.overlay.missing))
      .np_warning("plot.data.overlay is available only for regression surfaces, not derivatives")
    return(FALSE)
  }
  if (isTRUE(coef)) {
    if (!isTRUE(plot.data.overlay.missing))
      .np_warning("plot.data.overlay is available only for regression surfaces, not coefficient plots")
    return(FALSE)
  }
  TRUE
}

.np_plot_overlay_range <- function(existing.range, ydat) {
  yr <- range(ydat, finite = TRUE)
  if (!length(yr) || any(!is.finite(yr)))
    return(existing.range)

  if (is.null(existing.range) || length(existing.range) < 2L ||
      all(!is.finite(existing.range))) {
    return(yr)
  }

  c(min(existing.range[1L], yr[1L], na.rm = TRUE),
    max(existing.range[2L], yr[2L], na.rm = TRUE))
}

.np_plot_overlay_points_1d <- function(x, y, col = NULL, pch = 20, cex = 0.5, ...) {
  if (is.null(x) || is.null(y))
    return(invisible(FALSE))
  if (is.factor(x) || is.ordered(x))
    return(invisible(FALSE))

  ok <- is.finite(x) & is.finite(y)
  if (!any(ok))
    return(invisible(FALSE))

  if (is.null(col))
    col <- grDevices::adjustcolor("gray30", alpha.f = 0.35)
  if (is.null(pch))
    pch <- 20
  if (is.null(cex))
    cex <- 0.5
  points(x[ok], y[ok], pch = pch, cex = cex, col = col, ...)
  invisible(TRUE)
}

.np_plot_overlay_points_factor <- function(x, y, col = NULL, pch = 20, cex = 0.5, ...) {
  if (is.null(x) || is.null(y))
    return(invisible(FALSE))
  if (!(is.factor(x) || is.ordered(x)))
    return(invisible(FALSE))

  ok <- !is.na(x) & is.finite(y)
  if (!any(ok))
    return(invisible(FALSE))

  if (is.null(col))
    col <- grDevices::adjustcolor("gray30", alpha.f = 0.35)
  if (is.null(pch))
    pch <- 20
  if (is.null(cex))
    cex <- 0.5
  points(x[ok], y[ok], pch = pch, cex = cex, col = col, ...)
  invisible(TRUE)
}

.np_plot_overlay_points_persp <- function(x1, x2, y, persp.mat, col = NULL, pch = 20, cex = 0.5, ...) {
  if (is.null(x1) || is.null(x2) || is.null(y))
    return(invisible(FALSE))

  ok <- is.finite(x1) & is.finite(x2) & is.finite(y)
  if (!any(ok))
    return(invisible(FALSE))

  if (is.null(col))
    col <- grDevices::adjustcolor("gray30", alpha.f = 0.35)
  if (is.null(pch))
    pch <- 20
  if (is.null(cex))
    cex <- 0.5
  xyz <- trans3d(x1[ok], x2[ok], y[ok], persp.mat)
  points(xyz, pch = pch, cex = cex, col = col, ...)
  invisible(TRUE)
}

.np_plot_overlay_points_rgl <- function(x1,
                                        x2,
                                        y,
                                        points3d.args = list()) {
  if (is.null(x1) || is.null(x2) || is.null(y))
    return(invisible(FALSE))

  ok <- is.finite(x1) & is.finite(x2) & is.finite(y)
  if (!any(ok))
    return(invisible(FALSE))

  point.args <- .np_plot_merge_override_args(
    list(
      x = x1[ok],
      y = x2[ok],
      z = y[ok],
      color = grDevices::adjustcolor("gray20", alpha.f = 0.6),
      alpha = 0.6,
      size = 5
    ),
    points3d.args
  )
  do.call(rgl::points3d, point.args)
  invisible(TRUE)
}

.np_plot_match_flag <- function(value, argname) {
  value <- as.logical(value)[1L]
  if (is.na(value)) {
    stop(sprintf("%s must be TRUE or FALSE.", argname), call. = FALSE)
  }
  value
}

.np_plot_axis_is_continuous <- function(x) {
  !is.factor(x)
}

.np_plot_validate_rug_request <- function(plot.rug,
                                          route,
                                          supported.route = FALSE,
                                          renderer = "base",
                                          reason = "supported plot routes for the selected renderer") {
  plot.rug <- .np_plot_match_flag(plot.rug, "plot.rug")

  if (!isTRUE(plot.rug))
    return(FALSE)

  renderer <- .np_plot_match_renderer(renderer)

  if (!isTRUE(supported.route)) {
    stop(sprintf("plot.rug=TRUE is currently implemented only for %s in %s.",
                 reason, route),
         call. = FALSE)
  }

  TRUE
}

.np_plot_draw_rug_1d <- function(x,
                                 rug.args = list()) {
  if (is.null(x))
    return(invisible(FALSE))

  x <- as.vector(x)
  ok <- is.finite(x)
  if (!any(ok))
    return(invisible(FALSE))

  args <- .np_plot_merge_override_args(
    list(
      x = x[ok],
      col = grDevices::adjustcolor("gray20", alpha.f = 0.6),
      quiet = TRUE
    ),
    rug.args
  )
  do.call(graphics::rug, args)
  invisible(TRUE)
}

.np_plot_draw_floor_rug_persp <- function(x1,
                                          x2,
                                          zlim,
                                          persp.mat,
                                          segments.args = list()) {
  if (is.null(x1) || is.null(x2) || is.null(zlim) || is.null(persp.mat))
    return(invisible(FALSE))

  ok <- is.finite(x1) & is.finite(x2)
  if (!any(ok))
    return(invisible(FALSE))

  zlim <- as.double(zlim)
  if (length(zlim) < 2L || !all(is.finite(zlim)))
    return(invisible(FALSE))

  zfloor <- zlim[1L]
  zspan <- diff(range(zlim))
  if (!is.finite(zspan) || zspan <= 0) {
    zspan <- max(1, abs(zfloor))
  }
  ztop <- zfloor + 0.02 * zspan

  lower <- trans3d(x1[ok], x2[ok], rep.int(zfloor, sum(ok)), persp.mat)
  upper <- trans3d(x1[ok], x2[ok], rep.int(ztop, sum(ok)), persp.mat)

  args <- .np_plot_merge_override_args(
    list(
      x0 = lower$x,
      y0 = lower$y,
      x1 = upper$x,
      y1 = upper$y,
      col = grDevices::adjustcolor("gray20", alpha.f = 0.55),
      lwd = 1.25
    ),
    segments.args
  )
  do.call(graphics::segments, args)
  invisible(TRUE)
}

.np_plot_draw_floor_rug_rgl <- function(x1,
                                        x2,
                                        zlim,
                                        segments3d.args = list()) {
  if (is.null(x1) || is.null(x2) || is.null(zlim))
    return(invisible(FALSE))

  ok <- is.finite(x1) & is.finite(x2)
  if (!any(ok))
    return(invisible(FALSE))

  zlim <- as.double(zlim)
  if (length(zlim) < 2L || !all(is.finite(zlim)))
    return(invisible(FALSE))

  zfloor <- zlim[1L]
  zspan <- diff(range(zlim))
  if (!is.finite(zspan) || zspan <= 0) {
    zspan <- max(1, abs(zfloor))
  }
  ztop <- zfloor + 0.02 * zspan

  args <- .np_plot_merge_override_args(
    list(
      x = rbind(x1[ok], x1[ok]),
      y = rbind(x2[ok], x2[ok]),
      z = rbind(rep.int(zfloor, sum(ok)), rep.int(ztop, sum(ok))),
      color = grDevices::adjustcolor("gray20", alpha.f = 0.55),
      alpha = 0.55,
      lwd = 2
    ),
    segments3d.args
  )
  do.call(rgl::segments3d, args)
  invisible(TRUE)
}

.np_plot_draw_box_grid_persp <- function(xlim,
                                         ylim,
                                         zlim,
                                         persp.mat,
                                         grid.args = list()) {
  if (is.null(xlim) || is.null(ylim) || is.null(zlim) || is.null(persp.mat))
    return(invisible(FALSE))

  xlim <- as.double(xlim)
  ylim <- as.double(ylim)
  zlim <- as.double(zlim)

  if (length(xlim) < 2L || length(ylim) < 2L || length(zlim) < 2L)
    return(invisible(FALSE))
  if (!all(is.finite(c(xlim, ylim, zlim))))
    return(invisible(FALSE))

  x.at <- pretty(xlim, n = 5L)
  y.at <- pretty(ylim, n = 5L)
  z.at <- pretty(zlim, n = 5L)

  x.at <- x.at[x.at >= min(xlim) & x.at <= max(xlim)]
  y.at <- y.at[y.at >= min(ylim) & y.at <= max(ylim)]
  z.at <- z.at[z.at >= min(zlim) & z.at <= max(zlim)]

  draw_segment <- function(x0, y0, z0, x1, y1, z1) {
    pts <- trans3d(c(x0, x1), c(y0, y1), c(z0, z1), persp.mat)
    seg.args <- .np_plot_merge_override_args(
      list(
        x0 = pts$x[1L],
        y0 = pts$y[1L],
        x1 = pts$x[2L],
        y1 = pts$y[2L],
        col = grDevices::adjustcolor("grey60", alpha.f = 0.45),
        lwd = 0.9
      ),
      grid.args
    )
    do.call(graphics::segments, seg.args)
  }

  xmin <- min(xlim)
  xmax <- max(xlim)
  ymin <- min(ylim)
  ymax <- max(ylim)
  zmin <- min(zlim)
  zmax <- max(zlim)

  for (yy in y.at)
    draw_segment(xmin, yy, zmin, xmax, yy, zmin)
  for (xx in x.at)
    draw_segment(xx, ymin, zmin, xx, ymax, zmin)

  for (yy in y.at)
    draw_segment(xmin, yy, zmin, xmin, yy, zmax)
  for (zz in z.at)
    draw_segment(xmin, ymin, zz, xmin, ymax, zz)

  for (xx in x.at)
    draw_segment(xx, ymax, zmin, xx, ymax, zmax)
  for (zz in z.at)
    draw_segment(xmin, ymax, zz, xmax, ymax, zz)

  invisible(TRUE)
}

.np_plot_error_surfaces_rgl <- function(x,
                                        y,
                                        plot.errors.type,
                                        lerr = NULL,
                                        herr = NULL,
                                        lerr.all = NULL,
                                        herr.all = NULL,
                                        surface3d.args = list(),
                                        legend3d.args = list()) {
  draw_one <- function(z, color) {
    if (is.null(z))
      return(invisible(FALSE))
    if (!any(is.finite(z)))
      return(invisible(FALSE))
    surf.args <- .np_plot_merge_override_args(
      list(
        x = x,
        y = y,
        z = z,
        color = color,
        alpha = 0.2,
        front = "lines",
        back = "lines",
        lit = FALSE
      ),
      surface3d.args
    )
    do.call(rgl::surface3d, surf.args)
    invisible(TRUE)
  }

  if (identical(plot.errors.type, "all") &&
      !is.null(lerr.all) &&
      !is.null(herr.all)) {
    band.cols <- .np_plot_all_band_colors()
    band.alpha <- .np_plot_all_band_alpha()
    drawn.bands <- character(0L)
    for (bn in c("pointwise", "simultaneous", "bonferroni")) {
      drawn.lower <- draw_one(
        lerr.all[[bn]],
        grDevices::adjustcolor(band.cols[[bn]], alpha.f = band.alpha[[bn]])
      )
      drawn.upper <- draw_one(
        herr.all[[bn]],
        grDevices::adjustcolor(band.cols[[bn]], alpha.f = band.alpha[[bn]])
      )
      if (isTRUE(drawn.lower) || isTRUE(drawn.upper))
        drawn.bands <- c(drawn.bands, bn)
    }
    if (!length(drawn.bands)) {
      return(invisible(FALSE))
    }
    legend3d.call <- .np_plot_merge_override_args(
      list(
        "topright",
        legend = c(pointwise = "Pointwise",
                   simultaneous = "Simultaneous",
                   bonferroni = "Bonferroni")[drawn.bands],
        col = unname(band.cols[drawn.bands]),
        lty = 1,
        lwd = 2.15,
        cex = 0.8,
        bg = "white",
        bty = "n"
      ),
      legend3d.args
    )
    do.call(rgl::legend3d, legend3d.call)
    return(invisible(TRUE))
  }

  draw_one(lerr, "grey40")
  draw_one(herr, "grey40")
  invisible(TRUE)
}

.np_plot_match_renderer <- function(renderer) {
  match.arg(renderer, c("base", "rgl"))
}

.np_plot_rgl_view_angles <- function(theta, phi) {
  theta <- as.double(theta)[1L]
  phi <- as.double(phi)[1L]

  if (isTRUE(all.equal(theta, 0.0)) && isTRUE(all.equal(phi, 20.0))) {
    phi <- -70.0
  }

  list(theta = theta, phi = phi)
}

.np_plot_rotate_defaults <- function() {
  list(
    dtheta = 5.625,
    sleep = 0.24
  )
}

.np_plot_format_angle <- function(angle, digits = 0L) {
  angle <- as.double(angle)[1L]
  digits <- as.integer(digits)[1L]
  if (is.na(digits) || digits < 0L)
    digits <- 0L

  rounded <- round(angle, digits = digits)
  if (isTRUE(all.equal(rounded, round(rounded)))) {
    return(format(round(rounded), trim = TRUE, scientific = FALSE))
  }

  formatC(rounded, format = "f", digits = digits)
}

.np_plot_theta_phi_label <- function(theta, phi) {
  paste0(
    "[theta= ",
    .np_plot_format_angle(theta),
    ", phi= ",
    .np_plot_format_angle(phi),
    "]"
  )
}

.np_plot_persp_surface_colors <- function(z, col = NULL, num.colors = 1000L) {
  if (!is.null(col))
    return(col)

  z <- as.matrix(z)
  z.range <- range(z, finite = TRUE)
  palette_fun <- function(n) grDevices::hcl.colors(as.integer(n), palette = "viridis")

  if (!all(is.finite(z.range)))
    return(palette_fun(1L))

  if (nrow(z) < 2L || ncol(z) < 2L)
    return(palette_fun(1L))

  if (isTRUE(all.equal(z.range[1L], z.range[2L])))
    return(palette_fun(1L))

  zfacet <- 0.25 * (
    z[-1L, -1L, drop = FALSE] +
      z[-1L, -ncol(z), drop = FALSE] +
      z[-nrow(z), -1L, drop = FALSE] +
      z[-nrow(z), -ncol(z), drop = FALSE]
  )

  colorlut <- palette_fun(num.colors)
  scaled <- 1L + floor((length(colorlut) - 1L) * (zfacet - z.range[1L]) / diff(z.range))
  scaled[!is.finite(scaled)] <- 1L
  scaled <- pmax.int(1L, pmin.int(length(colorlut), scaled))

  as.vector(matrix(colorlut[scaled], nrow = nrow(zfacet), ncol = ncol(zfacet)))
}

.np_plot_all_band_colors <- function() {
  c(
    pointwise = "#D55E00",
    simultaneous = "#7B3294",
    bonferroni = "#0072B2"
  )
}

.np_plot_all_band_alpha <- function() {
  c(
    pointwise = 0.14,
    simultaneous = 0.10,
    bonferroni = 0.08
  )
}

.np_plot_error_wire_alpha <- function(plot.errors.type) {
  plot.errors.type <- as.character(plot.errors.type)[1L]
  band.alpha <- .np_plot_all_band_alpha()

  switch(
    plot.errors.type,
    pointwise = band.alpha[["pointwise"]],
    simultaneous = band.alpha[["simultaneous"]],
    bonferroni = band.alpha[["bonferroni"]],
    band.alpha[["pointwise"]]
  )
}

.np_plot_wireframe_templates_persp <- function(x, y) {
  x <- as.double(x)
  y <- as.double(y)

  nx <- length(x)
  ny <- length(y)

  list(
    row_x = matrix(rep(x, ny), nrow = nx, ncol = ny),
    row_y = matrix(rep(y, each = nx), nrow = nx, ncol = ny),
    col_x = matrix(rep(x, each = ny), nrow = ny, ncol = nx),
    col_y = matrix(rep(y, nx), nrow = ny, ncol = nx),
    nx = nx,
    ny = ny
  )
}

.np_plot_project_wire_matrix_persp <- function(xmat, ymat, zmat, pmat) {
  tr <- cbind(
    as.vector(xmat),
    as.vector(ymat),
    as.vector(zmat),
    1
  ) %*% pmat

  list(
    x = matrix(tr[, 1L] / tr[, 4L], nrow = nrow(xmat), ncol = ncol(xmat)),
    y = matrix(tr[, 2L] / tr[, 4L], nrow = nrow(ymat), ncol = ncol(ymat))
  )
}

.np_plot_draw_wire_surface_persp <- function(templates,
                                             zmat,
                                             persp.mat,
                                             col,
                                             lwd = 0.8) {
  row_pts <- .np_plot_project_wire_matrix_persp(
    xmat = templates$row_x,
    ymat = templates$row_y,
    zmat = zmat,
    pmat = persp.mat
  )

  for (j in seq_len(templates$ny))
    graphics::lines(row_pts$x[, j], row_pts$y[, j], col = col, lwd = lwd)

  col_pts <- .np_plot_project_wire_matrix_persp(
    xmat = templates$col_x,
    ymat = templates$col_y,
    zmat = t(zmat),
    pmat = persp.mat
  )

  for (i in seq_len(templates$nx))
    graphics::lines(col_pts$x[, i], col_pts$y[, i], col = col, lwd = lwd)

  invisible(NULL)
}

.np_plot_draw_error_wireframes_persp <- function(x,
                                                 y,
                                                 persp.mat,
                                                 plot.errors.type,
                                                 lerr = NULL,
                                                 herr = NULL,
                                                 lerr.all = NULL,
                                                 herr.all = NULL,
                                                 border = "grey",
                                                 lwd = 0.8) {
  templates <- .np_plot_wireframe_templates_persp(x = x, y = y)

  if (identical(as.character(plot.errors.type)[1L], "all") &&
      !is.null(lerr.all) && !is.null(herr.all)) {
    band.cols <- .np_plot_all_band_colors()
    band.alpha <- .np_plot_all_band_alpha()
    band.lwd <- 2.15 * lwd

    for (bn in c("pointwise", "simultaneous", "bonferroni")) {
      band.col <- grDevices::adjustcolor(band.cols[[bn]], alpha.f = band.alpha[[bn]])

      .np_plot_draw_wire_surface_persp(
        templates = templates,
        zmat = lerr.all[[bn]],
        persp.mat = persp.mat,
        col = band.col,
        lwd = band.lwd
      )

      .np_plot_draw_wire_surface_persp(
        templates = templates,
        zmat = herr.all[[bn]],
        persp.mat = persp.mat,
        col = band.col,
        lwd = band.lwd
      )
    }

    return(invisible(NULL))
  }

  wire.col <- grDevices::adjustcolor(
    "black",
    alpha.f = max(.np_plot_error_wire_alpha(plot.errors.type = plot.errors.type), 0.18)
  )
  wire.lwd <- 2.0 * lwd

  .np_plot_draw_wire_surface_persp(
    templates = templates,
    zmat = lerr,
    persp.mat = persp.mat,
    col = wire.col,
    lwd = wire.lwd
  )

  .np_plot_draw_wire_surface_persp(
    templates = templates,
    zmat = herr,
    persp.mat = persp.mat,
    col = wire.col,
    lwd = wire.lwd
  )

  invisible(NULL)
}

.np_plot_rgl_surface_colors <- function(z, col = NULL, num.colors = 1000L) {
  if (!is.null(col))
    return(col)

  z <- as.matrix(z)
  z.range <- range(z, finite = TRUE)
  palette_fun <- function(n) grDevices::hcl.colors(as.integer(n), palette = "viridis")

  if (!all(is.finite(z.range)))
    return(palette_fun(1L))

  if (isTRUE(all.equal(z.range[1L], z.range[2L]))) {
    return(matrix(palette_fun(1L), nrow = nrow(z), ncol = ncol(z)))
  }

  colorlut <- palette_fun(num.colors)
  scaled <- 1L + floor((length(colorlut) - 1L) * (z - z.range[1L]) / diff(z.range))
  scaled[!is.finite(scaled)] <- 1L
  scaled <- pmax.int(1L, pmin.int(length(colorlut), scaled))

  matrix(colorlut[scaled], nrow = nrow(z), ncol = ncol(z))
}

.np_plot_validate_renderer_request <- function(renderer,
                                               route,
                                               perspective,
                                               supported.route = TRUE,
                                               view = "fixed",
                                               gradients = FALSE,
                                               coef = FALSE,
                                               plot.errors.method = "none",
                                               plot.data.overlay = FALSE,
                                               plot.behavior = "plot",
                                               allow.plot.errors = FALSE,
                                               allow.plot.data.overlay = FALSE) {
  renderer <- .np_plot_match_renderer(renderer)
  plot.behavior <- as.character(plot.behavior)[1L]

  if (!identical(renderer, "rgl"))
    return(renderer)

  if (identical(plot.behavior, "data"))
    return(renderer)

  if (!isTRUE(perspective)) {
    stop("renderer='rgl' requires perspective=TRUE.", call. = FALSE)
  }

  if (!isTRUE(supported.route)) {
    stop(sprintf(
      "renderer='rgl' is currently implemented only for supported 2D surface routes in %s",
      route
    ), call. = FALSE)
  }

  if (isTRUE(gradients)) {
    stop("renderer='rgl' does not yet support gradients=TRUE. Use renderer='base'.",
         call. = FALSE)
  }

  if (isTRUE(coef)) {
    stop("renderer='rgl' does not yet support coefficient-mode plots. Use renderer='base'.",
         call. = FALSE)
  }

  if (!identical(as.character(view)[1L], "fixed")) {
    stop("renderer='rgl' currently supports view='fixed' only in this rollout tranche.",
         call. = FALSE)
  }

  if (!identical(as.character(plot.errors.method)[1L], "none")) {
    if (!isTRUE(allow.plot.errors)) {
      stop("renderer='rgl' does not yet support plot.errors.method != 'none'. Use renderer='base'.",
           call. = FALSE)
    }
  }

  if (isTRUE(plot.data.overlay)) {
    if (!isTRUE(allow.plot.data.overlay)) {
      stop("renderer='rgl' does not yet support plot.data.overlay=TRUE. Use renderer='base' or disable overlay.",
           call. = FALSE)
    }
  }

  if (!(plot.behavior %in% c("plot", "plot-data"))) {
    stop("renderer='rgl' currently supports plot.behavior %in% c('plot', 'plot-data', 'data') only in this rollout tranche.",
         call. = FALSE)
  }

  if (!isTRUE(suppressWarnings(requireNamespace("rgl", quietly = TRUE)))) {
    stop("renderer='rgl' requires the suggested package 'rgl'. Please install it with install.packages('rgl').",
         call. = FALSE)
  }

  renderer
}

.np_plot_rgl_finalize <- function(rgl.out,
                                  plot.behavior = "plot",
                                  plot.data = NULL) {
  plot.behavior <- as.character(plot.behavior)[1L]

  if (identical(plot.behavior, "plot-data"))
    return(plot.data)

  if (!is.null(rgl.out))
    return(rgl.out)

  invisible(NULL)
}

.np_plot_render_surface_rgl <- function(x,
                                        y,
                                        z,
                                        xlab,
                                        ylab,
                                        zlab,
                                        main,
                                        theta,
                                        phi,
                                        col = NULL,
                                        border = "black",
                                        zlim = NULL,
                                        par3d.args = list(),
                                        view3d.args = list(),
                                        persp3d.args = list(),
                                        grid3d.args = list(),
                                        widget.args = list(),
                                        draw.extras = NULL) {
  tryCatch({
    old.opts <- options(
      rgl.useNULL = TRUE,
      rgl.printRglwidget = TRUE
    )
    on.exit(options(old.opts), add = TRUE)
    old.env <- Sys.getenv("RGL_USE_NULL", unset = NA_character_)
    Sys.setenv(RGL_USE_NULL = "TRUE")
    on.exit({
      if (is.na(old.env)) {
        Sys.unsetenv("RGL_USE_NULL")
      } else {
        Sys.setenv(RGL_USE_NULL = old.env)
      }
    }, add = TRUE)
    devices.before <- try(rgl::rgl.dev.list(), silent = TRUE)
    if (inherits(devices.before, "try-error") || is.null(devices.before))
      devices.before <- integer(0L)

    rgl::open3d(useNULL = TRUE, silent = TRUE)
    par3d.call <- .np_plot_merge_override_args(
      list(windowRect = c(900, 100, 900 + 640, 100 + 640)),
      par3d.args
    )
    do.call(rgl::par3d, par3d.call)

    view3d.call <- .np_plot_merge_override_args(
      list(theta = theta, phi = phi, fov = 80),
      view3d.args
    )
    do.call(rgl::view3d, view3d.call)

    persp3d.call <- .np_plot_merge_override_args(list(
      x = x,
      y = y,
      z = z,
      zlim = zlim,
      xlab = xlab,
      ylab = ylab,
      zlab = zlab,
      ticktype = "detailed",
      border = border,
      color = .np_plot_rgl_surface_colors(z = z, col = col),
      alpha = 0.6,
      back = "lines",
      main = main
    ), persp3d.args)
    do.call(rgl::persp3d, persp3d.call)

    if (!is.null(draw.extras))
      draw.extras()

    grid.side <- c("x", "y+", "z")
    if (!is.null(grid3d.args$side)) {
      grid.side <- grid3d.args$side
      grid3d.args$side <- NULL
    }
    grid3d.call <- c(list(grid.side), grid3d.args)
    do.call(rgl::grid3d, grid3d.call)
    if (isTRUE(rgl::rgl.useNULL()) || isTRUE(getOption("rgl.printRglwidget"))) {
      scene <- rgl::scene3d()
      devices.after <- try(rgl::rgl.dev.list(), silent = TRUE)
      if (inherits(devices.after, "try-error") || is.null(devices.after))
        devices.after <- integer(0L)
      new.devices <- setdiff(devices.after, devices.before)
      if (length(new.devices))
        try(rgl::close3d(dev = new.devices, silent = TRUE), silent = TRUE)
      else
        try(rgl::close3d(silent = TRUE), silent = TRUE)
      widget <- do.call(rgl::rglwidget, c(list(x = scene), widget.args))
      print(widget)
      return(widget)
    }
    NULL
  }, error = function(e) {
    stop(sprintf("renderer='rgl' failed to draw the surface (%s)", conditionMessage(e)),
         call. = FALSE)
  })
}

.np_plot_user_args <- function(dots,
                               type = c("plot", "points", "lines", "persp", "bxp",
                                        "rgl.persp3d", "rgl.view3d", "rgl.par3d",
                                        "rgl.grid3d", "rgl.widget", "rgl.legend3d")) {
  if (is.null(dots) || !length(dots))
    return(list())

  type <- match.arg(type)
  allowed <- switch(type,
                    plot = c("pch", "cex", "xaxs", "yaxs", "xaxt", "yaxt",
                             "las", "font", "adj", "bg", "fg", "bty", "asp"),
                    points = c("pch", "cex", "col", "bg"),
                    lines = c("lty", "lwd", "col"),
                    persp = c("shade", "ltheta", "lphi", "expand", "nticks",
                              "box", "axes"),
                    rgl.persp3d = c("alpha", "back", "front", "lit", "smooth",
                                    "color",
                                    "specular", "ambient", "emission",
                                    "shininess", "polygon_offset", "fog",
                                    "texture"),
                    rgl.view3d = c("fov", "zoom"),
                    rgl.par3d = c("windowRect"),
                    rgl.grid3d = c("side", "at", "col", "lwd", "lty", "n"),
                    rgl.widget = c("width", "height", "controllers"),
                    rgl.legend3d = c("x", "y", "legend", "fill", "border",
                                     "col", "text.col", "adj", "cex",
                                     "pt.cex", "pch", "xjust", "yjust",
                                     "x.intersp", "y.intersp", "merge",
                                     "trace", "plot", "ncol", "horiz",
                                     "title", "inset", "bg", "bty", "box.lwd",
                                     "box.lty", "box.col", "pt.bg",
                                     "lwd", "lty", "seg.len"),
                    bxp = c("boxfill", "outline", "notch", "varwidth",
                            "frame.plot", "horizontal", "at", "show.names",
                            "pars", "pch", "cex", "col", "bg"))

  dots[names(dots) %in% allowed]
}

.np_plot_extract_prefixed_args <- function(dots, prefix) {
  if (is.null(dots) || !length(dots))
    return(list())

  hits <- startsWith(names(dots), prefix)
  if (!any(hits))
    return(list())

  out <- dots[hits]
  names(out) <- substring(names(out), nchar(prefix) + 1L)
  out
}

.np_plot_collect_rgl_args <- function(dots, type, prefix) {
  direct.args <- .np_plot_user_args(dots, type)
  prefixed.args <- .np_plot_extract_prefixed_args(dots, prefix)
  .np_plot_merge_override_args(direct.args, prefixed.args)
}

.np_plot_merge_user_args <- function(base.args, user.args) {
  if (is.null(user.args) || !length(user.args))
    return(base.args)
  if (is.null(base.args) || !length(base.args))
    return(user.args)

  base.names <- names(base.args)
  user.names <- names(user.args)
  dup <- intersect(user.names[!(is.na(user.names) | user.names == "")],
                   base.names[!(is.na(base.names) | base.names == "")])
  if (length(dup)) {
    keep <- is.na(user.names) | user.names == "" | !(user.names %in% dup)
    user.args <- user.args[keep]
  }
  c(base.args, user.args)
}

.np_plot_merge_override_args <- function(base.args, override.args) {
  if (is.null(override.args) || !length(override.args))
    return(base.args)
  if (is.null(base.args) || !length(base.args))
    return(override.args)

  base.names <- names(base.args)
  override.names <- names(override.args)
  dup <- intersect(override.names[!(is.na(override.names) | override.names == "")],
                   base.names[!(is.na(base.names) | base.names == "")])
  if (length(dup)) {
    keep <- is.na(base.names) | base.names == "" | !(base.names %in% dup)
    base.args <- base.args[keep]
  }
  c(base.args, override.args)
}

.np_plot_resolve_xydat <- function(bws, xdat, ydat, miss.xy) {
  if (any(miss.xy) && !all(miss.xy))
    stop("one of, but not both, xdat and ydat was specified")

  if (all(miss.xy) && !is.null(bws$formula)) {
    tt <- terms(bws)
    m <- match(c("formula", "data", "subset", "na.action"),
               names(bws$call), nomatch = 0)
    tmf <- bws$call[c(1, m)]
    tmf[[1]] <- as.name("model.frame")
    tmf[["formula"]] <- tt
    mf.args <- as.list(tmf)[-1L]
    tmf <- do.call(stats::model.frame, mf.args, envir = environment(tt))

    ydat <- model.response(tmf)
    xdat <- tmf[, attr(attr(tmf, "terms"), "term.labels"), drop = FALSE]
    return(list(xdat = xdat, ydat = ydat))
  }

  if (all(miss.xy) && !is.null(bws$call)) {
    xdat <- data.frame(.np_eval_bws_call_arg(bws, "xdat"))
    ydat <- .np_eval_bws_call_arg(bws, "ydat")
  }

  xdat <- toFrame(xdat)
  goodrows <- seq_len(nrow(xdat))
  rows.omit <- attr(na.omit(data.frame(xdat, ydat)), "na.action")
  if (!is.null(rows.omit))
    goodrows[rows.omit] <- 0

  if (all(goodrows == 0))
    stop("Data has no rows without NAs")

  goodrows <- goodrows[goodrows != 0]
  list(xdat = xdat[goodrows, , drop = FALSE],
       ydat = ydat[goodrows])
}

.np_plot_regression_eval <- function(bws,
                                     xdat,
                                     ydat,
                                     exdat,
                                     gradients = FALSE,
                                     gradient.order = 1L,
                                     need.asymptotic = FALSE) {
  .np_plot_activity_run(
    label = if (isTRUE(need.asymptotic)) {
      "Computing regression plot asymptotic fit"
    } else {
      "Computing regression plot fit"
    },
    expr = {
      if (isTRUE(need.asymptotic)) {
        return(npreg(
          txdat = xdat,
          tydat = ydat,
          exdat = exdat,
          bws = bws,
          gradients = gradients,
          gradient.order = gradient.order,
          warn.glp.gradient = FALSE
        ))
      }

      fit <- .np_regression_direct(
        bws = bws,
        txdat = xdat,
        tydat = ydat,
        exdat = exdat,
        gradients = gradients,
        gradient.order = gradient.order,
        local.mode = identical(bws$type, "generalized_nn")
      )

      neval <- length(fit$mean)
      fit$merr <- rep(NA_real_, neval)
      if (isTRUE(gradients))
        fit$gerr <- matrix(NA_real_, nrow = neval, ncol = NCOL(fit$grad))

      fit
    }
  )
}

.np_plot_validate_neval <- function(neval, where = "plot.singleindex") {
  neval <- as.integer(neval)[1L]
  if (is.na(neval) || neval < 1L)
    stop(sprintf("argument 'neval' must be a positive integer in %s", where),
         call. = FALSE)
  neval
}

.np_plot_singleindex_eval_grid <- function(bws,
                                           xdat,
                                           neval,
                                           trim = 0.0,
                                           where = "plot.singleindex") {
  xdat <- adjustLevels(toFrame(xdat), bws$xdati)
  neval <- .np_plot_validate_neval(neval, where = where)
  index.train <- as.vector(toMatrix(xdat) %*% bws$beta)
  bounds <- trim.quantiles(index.train, trim = trim)
  index.eval <- seq(bounds[1L], bounds[2L], length.out = neval)

  list(
    idx.train = data.frame(index = index.train),
    idx.eval = data.frame(index = index.eval),
    index.train = index.train,
    index.eval = index.eval,
    trainiseval = isTRUE(length(index.train) == length(index.eval)) &&
      isTRUE(all.equal(index.train, index.eval, tolerance = 0))
  )
}

.np_plot_singleindex_hat_apply_index <- function(bws, idx.train, idx.eval, y) {
  if (identical(bws$type, "fixed")) {
    return(.np_indexhat_core(
      bws = bws,
      idx.train = idx.train,
      idx.eval = idx.eval,
      y = y,
      output = "apply",
      ridge = 0.0
    ))
  }

  .np_indexhat_exact(
    bws = bws,
    idx.train = idx.train,
    idx.eval = idx.eval,
    y = y,
    output = "apply",
    s = 0L
  )
}

.np_plot_singleindex_hat_matrix_index <- function(bws, idx.train, idx.eval, s = 0L) {
  s <- as.integer(s)[1L]
  if (is.na(s) || !(s %in% c(0L, 1L)))
    stop("argument 's' must be 0 or 1 in single-index plot hat helper",
         call. = FALSE)

  if (identical(s, 0L) && identical(bws$type, "fixed")) {
    return(.np_indexhat_core(
      bws = bws,
      idx.train = idx.train,
      idx.eval = idx.eval,
      output = "matrix",
      ridge = 0.0
    ))
  }

  .np_indexhat_exact(
    bws = bws,
    idx.train = idx.train,
    idx.eval = idx.eval,
    output = "matrix",
    s = s
  )
}

.np_plot_singleindex_local_eval <- function(bws,
                                            idx.train,
                                            idx.eval,
                                            ydat,
                                            gradients = FALSE) {
  .np_plot_activity_run(
    label = "Computing single-index plot fit",
    expr = {
      out <- list(index = as.vector(idx.eval$index))

      if (isTRUE(gradients)) {
        rbw <- .np_indexhat_rbw(bws = bws, idx.train = idx.train)
        fit.grad <- .np_regression_direct(
          bws = rbw,
          txdat = idx.train,
          tydat = ydat,
          exdat = idx.eval,
          gradients = TRUE,
          gradient.order = 1L
        )
        grad.index <- as.vector(fit.grad$grad[, 1L])
        out$mean <- as.vector(fit.grad$mean)
        out$grad.index <- grad.index
        out$grad <- grad.index %o% as.vector(bws$beta)
        return(out)
      }

      out$mean <- as.vector(.np_plot_singleindex_hat_apply_index(
        bws = bws,
        idx.train = idx.train,
        idx.eval = idx.eval,
        y = ydat
      ))
      out
    }
  )
}

.np_plot_singleindex_asymptotic_eval <- function(bws,
                                                 txdat,
                                                 tydat,
                                                 exdat = NULL,
                                                 gradients = FALSE,
                                                 index.eval = NULL) {
  .np_plot_activity_run(
    label = "Computing single-index plot asymptotic fit",
    expr = {
      has.index.eval <- !is.null(index.eval)
      no.ex <- is.null(exdat)
      gradients <- npValidateScalarLogical(gradients, "gradients")

      txdat <- toFrame(txdat)
      if (has.index.eval && !no.ex)
        stop("supply either 'exdat' or 'index.eval', not both")
      if (!has.index.eval && !no.ex) {
        exdat <- toFrame(exdat)
        if (!(txdat %~% exdat))
          stop("'txdat' and 'exdat' are not similar data frames!")
      }

      if (is.factor(tydat)) {
        tydat <- adjustLevels(data.frame(tydat), bws$ydati)[, 1L]
        tydat <- (bws$ydati$all.dlev[[1L]])[as.integer(tydat)]
      } else {
        tydat <- as.double(tydat)
      }

      txdat <- adjustLevels(txdat, bws$xdati)
      if (!no.ex)
        exdat <- adjustLevels(exdat, bws$xdati)

      txmat <- toMatrix(txdat)
      index <- as.vector(txmat %*% bws$beta)
      if (!has.index.eval) {
        exmat <- if (no.ex) txmat else toMatrix(exdat)
        index.eval <- as.vector(exmat %*% bws$beta)
      } else {
        index.eval <- as.double(index.eval)
        if (!length(index.eval) || anyNA(index.eval) || any(!is.finite(index.eval)))
          stop("argument 'index.eval' must contain finite evaluation points",
               call. = FALSE)
      }

      spec <- .npindex_resolve_spec(bws, where = "plot.singleindex")
      regtype <- spec$regtype.engine
      npreg.args <- list(
        txdat = data.frame(index = index),
        tydat = tydat,
        exdat = data.frame(index = index.eval),
        bws = bws$bw,
        bwtype = bws$type,
        ckertype = bws$ckertype,
        ckerorder = bws$ckerorder,
        regtype = regtype,
        gradients = gradients,
        warn.glp.gradient = FALSE
      )
      if (identical(regtype, "lp")) {
        npreg.args$basis <- spec$basis.engine
        npreg.args$degree <- spec$degree.engine
        npreg.args$bernstein.basis <- spec$bernstein.basis.engine
      }

      fit <- do.call(npreg, npreg.args)
      out <- list(
        index = index.eval,
        mean = as.vector(fit$mean),
        merr = as.double(fit$merr)
      )

      if (gradients) {
        grad.index <- as.vector(fit$grad[, 1L])
        gerr.index <- as.vector(fit$gerr[, 1L])
        beta <- as.vector(bws$beta)
        out$grad.index <- grad.index
        out$gerr.index <- gerr.index
        out$grad <- grad.index %o% beta
        out$gerr <- gerr.index %o% abs(beta)
      }

      out
    }
  )
}

.np_plot_plreg_asymptotic_fit <-
  function(bws,
           xdat,
           ydat,
           zdat,
           exdat,
           ezdat) {
    activity <- .np_plot_activity_begin("Computing partially linear plot asymptotic fit")
    on.exit(.np_plot_activity_end(activity), add = TRUE)

    xdat <- toFrame(xdat)
    zdat <- toFrame(zdat)

    keep.rows <- rep_len(TRUE, nrow(xdat))
    rows.omit <- attr(na.omit(data.frame(xdat, ydat, zdat)), "na.action")
    if (length(rows.omit) > 0L)
      keep.rows[as.integer(rows.omit)] <- FALSE

    if (!any(keep.rows))
      stop("Training data has no rows without NAs")

    xdat <- xdat[keep.rows, , drop = FALSE]
    ydat <- ydat[keep.rows]
    zdat <- zdat[keep.rows, , drop = FALSE]

    exdat <- toFrame(exdat)
    ezdat <- toFrame(ezdat)

    keep.eval <- rep_len(TRUE, nrow(exdat))
    rows.omit <- attr(na.omit(data.frame(exdat, ezdat)), "na.action")
    if (length(rows.omit) > 0L)
      keep.eval[as.integer(rows.omit)] <- FALSE

    if (!any(keep.eval))
      stop("Evaluation data has no rows without NAs")

    exdat <- exdat[keep.eval, , drop = FALSE]
    ezdat <- ezdat[keep.eval, , drop = FALSE]

    fit <- npplreg(
      bws = bws,
      txdat = xdat,
      tydat = ydat,
      tzdat = zdat,
      exdat = exdat,
      ezdat = ezdat
    )

    yfit <- npreg(
      txdat = zdat,
      tydat = ydat,
      exdat = ezdat,
      bws = bws$bw$yzbw
    )

    neval <- nrow(exdat)
    resx.eval <- matrix(0.0, nrow = neval, ncol = ncol(xdat))
    x.err.sq <- numeric(neval)

    for (j in seq_len(ncol(xdat))) {
      xfit <- npreg(
        txdat = zdat,
        tydat = xdat[, j],
        exdat = ezdat,
        bws = bws$bw[[j + 1L]]
      )

      if (is.factor(xdat[1L, j])) {
        tmp.eval <- adjustLevels(exdat[, j, drop = FALSE], bws$bw[[j + 1L]]$ydati, allowNewCells = TRUE)
        x.num.eval <- (bws$bw[[j + 1L]]$ydati$all.dlev[[1L]])[as.integer(tmp.eval[, 1L])]
      } else {
        x.num.eval <- as.double(exdat[, j])
      }

      resx.eval[, j] <- x.num.eval - xfit$mean
      x.err.sq <- x.err.sq + (fit$xcoef[j]^2) * (as.double(xfit$merr)^2)
    }

    beta.vcov.term <- rowSums((resx.eval %*% fit$xcoefvcov) * resx.eval)
    fit$merr <- sqrt(pmax(as.double(yfit$merr)^2 + x.err.sq + beta.vcov.term, 0.0))
    fit
  }

.np_plot_unconditional_eval <- function(xdat,
                                        exdat,
                                        bws,
                                        cdf = FALSE,
                                        need.asymptotic = FALSE) {
  .np_plot_activity_run(
    label = if (isTRUE(need.asymptotic)) {
      if (isTRUE(cdf)) {
        "Computing unconditional distribution plot asymptotic fit"
      } else {
        "Computing unconditional density plot asymptotic fit"
      }
    } else if (isTRUE(cdf)) {
      "Computing unconditional distribution plot fit"
    } else {
      "Computing unconditional density plot fit"
    },
    expr = {
      if (isTRUE(need.asymptotic)) {
        return(if (isTRUE(cdf)) {
          npudist(tdat = xdat, edat = exdat, bws = bws)
        } else {
          npudens(tdat = xdat, edat = exdat, bws = bws)
        })
      }

      est <- .np_ksum_unconditional_eval_exact(
        xdat = xdat,
        exdat = exdat,
        bws = bws,
        operator = if (isTRUE(cdf)) "integral" else "normal"
      )

      if (isTRUE(cdf)) {
        list(dist = est, derr = rep(NA_real_, length(est)))
      } else {
        list(dens = est, derr = rep(NA_real_, length(est)))
      }
    }
  )
}

.np_inid_boot_from_conditional_gradient_local <- function(xdat,
                                                          ydat,
                                                          exdat,
                                                          eydat,
                                                          bws,
                                                          B,
                                                          cdf,
                                                          gradient.index,
                                                          counts = NULL,
                                                          counts.drawer = NULL,
                                                          progress.label = NULL) {
  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (nrow(ydat) != n || nrow(exdat) != nrow(eydat))
    stop("conditional gradient bootstrap helper requires aligned x/y training and evaluation rows")
  if (n < 1L || B < 1L)
    stop("invalid conditional gradient bootstrap dimensions")

  fit.fun <- function(x.train, y.train) {
    as.vector(.np_plot_conditional_eval(
      bws = bws,
      xdat = x.train,
      ydat = y.train,
      exdat = exdat,
      eydat = eydat,
      cdf = cdf,
      gradients = TRUE
    )$congrad[, gradient.index, drop = TRUE])
  }

  t0 <- fit.fun(x.train = xdat, y.train = ydat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit.fun(
        x.train = xdat[idx, , drop = FALSE],
        y.train = ydat[idx, , drop = FALSE]
      )
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_inid_boot_from_quantile_gradient_local <- function(xdat,
                                                       ydat,
                                                       exdat,
                                                       bws,
                                                       B,
                                                       tau,
                                                       gradient.index,
                                                       counts = NULL,
                                                       counts.drawer = NULL,
                                                       progress.label = NULL) {
  xdat <- toFrame(xdat)
  ydat <- as.double(ydat)
  exdat <- toFrame(exdat)
  B <- as.integer(B)
  n <- nrow(xdat)

  if (length(ydat) != n)
    stop("quantile gradient bootstrap helper requires aligned x/y training rows")
  if (n < 1L || B < 1L)
    stop("invalid quantile gradient bootstrap dimensions")

  fit.fun <- function(x.train, y.train) {
    as.vector(.np_plot_quantile_eval(
      bws = bws,
      txdat = x.train,
      tydat = y.train,
      exdat = exdat,
      tau = tau,
      gradients = TRUE
    )$quantgrad[, gradient.index, drop = TRUE])
  }

  t0 <- fit.fun(x.train = xdat, y.train = ydat)
  tmat <- matrix(NA_real_, nrow = B, ncol = length(t0))
  counts.mat <- if (!is.null(counts)) .np_inid_counts_matrix(n = n, B = B, counts = counts) else NULL
  progress.label <- if (is.null(progress.label)) {
    if (!is.null(counts.drawer)) "Plot bootstrap block" else "Plot bootstrap inid"
  } else {
    progress.label
  }
  progress <- .np_plot_bootstrap_progress_begin(total = B, label = progress.label)
  on.exit({
    .np_plot_progress_end(progress)
  }, add = TRUE)

  start <- 1L
  chunk.size <- .np_inid_chunk_size(n = n, B = B, progress_cap = !is.null(counts.drawer))
  chunk.controller <- .np_plot_progress_chunk_controller(chunk.size = chunk.size, progress = progress)
  while (start <= B) {
    stopi <- min(B, start + chunk.controller$chunk.size - 1L)
    bsz <- stopi - start + 1L
    chunk.started <- .np_progress_now()
    counts.chunk <- if (!is.null(counts.mat)) {
      counts.mat[, start:stopi, drop = FALSE]
    } else if (!is.null(counts.drawer)) {
      .np_inid_counts_matrix(n = n, B = bsz, counts = counts.drawer(start, stopi))
    } else {
      stats::rmultinom(n = bsz, size = n, prob = rep.int(1 / n, n))
    }

    for (jj in seq_len(bsz)) {
      idx <- .np_counts_to_indices(counts.chunk[, jj])
      tmat[start + jj - 1L, ] <- fit.fun(
        x.train = xdat[idx, , drop = FALSE],
        y.train = ydat[idx]
      )
    }

    progress <- .np_plot_progress_tick(state = progress, done = stopi)
    chunk.controller <- .np_plot_progress_chunk_observe(
      controller = chunk.controller,
      bsz = bsz,
      elapsed.sec = .np_progress_now() - chunk.started
    )
    start <- stopi + 1L
  }

  list(t = tmat, t0 = t0)
}

.np_plot_quantile_eval <- function(bws,
                                   txdat,
                                   tydat,
                                   exdat,
                                   tau = 0.5,
                                   gradients = FALSE,
                                   tol = 1.490116e-04,
                                   small = 1.490116e-05,
                                   itmax = 10000,
                                   ...) {
  .np_plot_activity_run(
    label = "Computing quantile-regression plot fit",
    expr = {
      fit.start <- proc.time()[3]
      gradients <- npValidateScalarLogical(gradients, "gradients")

      if (!is.numeric(itmax) || length(itmax) != 1L || is.na(itmax) ||
          !is.finite(itmax) || itmax < 1 || itmax != floor(itmax))
        stop("'itmax' must be a positive integer")
      if (!is.numeric(tol) || length(tol) != 1L || is.na(tol) ||
          !is.finite(tol) || tol <= 0)
        stop("'tol' must be a positive finite numeric scalar")
      if (!is.numeric(small) || length(small) != 1L || is.na(small) ||
          !is.finite(small) || small <= 0)
        stop("'small' must be a positive finite numeric scalar")

      itmax <- as.integer(itmax)
      tol <- as.double(tol)
      small <- as.double(small)

      no.ex <- missing(exdat)

      xdat <- toFrame(txdat)
      ydat <- toFrame(tydat)

      if (!is.numeric(tau) || length(tau) != 1L || is.na(tau) || tau <= 0 || tau >= 1)
        stop("'tau' must be a single numeric value in (0,1)")
      if (ncol(ydat) != 1L)
        stop("'tydat' has more than one column")

      if (!no.ex) {
        exdat <- toFrame(exdat)
        if (!xdat %~% exdat)
          stop("'txdat' and 'exdat' are not similar data frames!")
      }

      if (length(bws$xbw) != length(xdat))
        stop("length of bandwidth vector does not match number of columns of 'txdat'")
      if (length(bws$ybw) != 1L)
        stop("length of bandwidth vector does not match number of columns of 'tydat'")

      if (any(bws$iyord) || any(bws$iyuno) || coarseclass(ydat[, 1L]) != "numeric")
        stop("'tydat' is not continuous")

      if ((any(bws$ixcon) &&
           !all(vapply(xdat[, bws$ixcon, drop = FALSE], inherits, logical(1), c("integer", "numeric")))) ||
          (any(bws$ixord) &&
           !all(vapply(xdat[, bws$ixord, drop = FALSE], inherits, logical(1), "ordered"))) ||
          (any(bws$ixuno) &&
           !all(vapply(xdat[, bws$ixuno, drop = FALSE], inherits, logical(1), "factor"))))
        stop("supplied bandwidths do not match 'txdat' in type")

      keep.rows <- rep_len(TRUE, nrow(xdat))
      rows.omit <- attr(na.omit(data.frame(xdat, ydat)), "na.action")
      if (length(rows.omit) > 0L)
        keep.rows[as.integer(rows.omit)] <- FALSE
      if (!any(keep.rows))
        stop("Training data has no rows without NAs")

      xdat <- xdat[keep.rows, , drop = FALSE]
      ydat <- ydat[keep.rows, , drop = FALSE]

      if (!no.ex) {
        keep.eval <- rep_len(TRUE, nrow(exdat))
        rows.omit <- attr(na.omit(exdat), "na.action")
        if (length(rows.omit) > 0L)
          keep.eval[as.integer(rows.omit)] <- FALSE
        exdat <- exdat[keep.eval, , drop = FALSE]
      }

      tnrow <- nrow(xdat)
      enrow <- if (no.ex) tnrow else nrow(exdat)

      xdat <- adjustLevels(xdat, bws$xdati)
      ydat <- adjustLevels(ydat, bws$ydati)
      if (!no.ex)
        exdat <- adjustLevels(exdat, bws$xdati)

      txeval <- if (no.ex) xdat else exdat
      xdat.df <- xdat
      ydat.df <- ydat
      if (!no.ex)
        exdat.df <- exdat

      ydat <- toMatrix(ydat)
      xdat <- toMatrix(xdat)

      xuno <- xdat[, bws$ixuno, drop = FALSE]
      xcon <- xdat[, bws$ixcon, drop = FALSE]
      xord <- xdat[, bws$ixord, drop = FALSE]

      if (!no.ex) {
        exdat <- toMatrix(exdat)
        exuno <- exdat[, bws$ixuno, drop = FALSE]
        excon <- exdat[, bws$ixcon, drop = FALSE]
        exord <- exdat[, bws$ixord, drop = FALSE]
      } else {
        exuno <- data.frame()
        excon <- data.frame()
        exord <- data.frame()
      }

      myopti <- list(
        num_obs_train = tnrow,
        num_obs_eval = enrow,
        int_LARGE_SF = if (bws$scaling) SF_NORMAL else SF_ARB,
        BANDWIDTH_den_extern = switch(bws$type,
          fixed = BW_FIXED,
          generalized_nn = BW_GEN_NN,
          adaptive_nn = BW_ADAP_NN
        ),
        int_MINIMIZE_IO = if (isTRUE(getOption("np.messages"))) IO_MIN_FALSE else IO_MIN_TRUE,
        xkerneval = switch(bws$cxkertype,
          gaussian = CKER_GAUSS + bws$cxkerorder / 2 - 1,
          epanechnikov = CKER_EPAN + bws$cxkerorder / 2 - 1,
          uniform = CKER_UNI,
          "truncated gaussian" = CKER_TGAUSS
        ),
        ykerneval = switch(bws$cykertype,
          gaussian = CKER_GAUSS + bws$cykerorder / 2 - 1,
          epanechnikov = CKER_EPAN + bws$cykerorder / 2 - 1,
          uniform = CKER_UNI,
          "truncated gaussian" = CKER_TGAUSS
        ),
        uxkerneval = switch(bws$uxkertype,
          aitchisonaitken = UKER_AIT,
          liracine = UKER_LR
        ),
        uykerneval = switch(bws$uykertype,
          aitchisonaitken = UKER_AIT,
          liracine = UKER_LR
        ),
        oxkerneval = switch(bws$oxkertype,
          wangvanryzin = OKER_WANG,
          liracine = OKER_LR,
          racineliyan = OKER_RLY
        ),
        oykerneval = switch(bws$oykertype,
          wangvanryzin = OKER_WANG,
          liracine = OKER_NLR,
          racineliyan = OKER_RLY
        ),
        num_yuno = bws$ynuno,
        num_yord = bws$ynord,
        num_ycon = bws$yncon,
        num_xuno = bws$xnuno,
        num_xord = bws$xnord,
        num_xcon = bws$xncon,
        no.ex = no.ex,
        gradients = gradients,
        itmax = itmax,
        xmcv.numRow = attr(bws$xmcv, "num.row"),
        nmulti = itmax,
        qreg.unused = 0L
      )

      myoptd <- c(
        qreg.unused = 0.0,
        tol = tol,
        small = small,
        rep(0.0, 7L)
      )

      myout <- .Call(
        "C_np_quantile_conditional",
        as.double(ydat),
        as.double(xuno), as.double(xord), as.double(xcon),
        as.double(exuno), as.double(exord), as.double(excon),
        as.double(tau),
        as.double(c(
          bws$xbw[bws$ixcon], bws$ybw[bws$iycon],
          bws$ybw[bws$iyuno], bws$ybw[bws$iyord],
          bws$xbw[bws$ixuno], bws$xbw[bws$ixord]
        )),
        as.double(bws$xmcv), as.double(attr(bws$xmcv, "pad.num")),
        as.double(bws$nconfac), as.double(bws$ncatfac), as.double(bws$sdev),
        as.integer(myopti),
        as.double(myoptd),
        as.integer(enrow),
        as.integer(bws$xndim),
        as.logical(gradients),
        PACKAGE = "np"
      )[c("yq", "yqerr", "yqgrad")]

      if (all(!is.finite(myout$yqerr) | myout$yqerr <= 0.0)) {
        dens.obj <- tryCatch(
          .np_plot_conditional_eval(
            bws = bws,
            xdat = xdat.df,
            ydat = ydat.df,
            exdat = if (no.ex) xdat.df else exdat.df,
            eydat = setNames(data.frame(as.double(myout$yq)), names(ydat.df)),
            cdf = FALSE,
            gradients = FALSE
          ),
          error = function(e) NULL
        )
        if (!is.null(dens.obj)) {
          dens.q <- as.double(dens.obj$condens)
          qvar <- tau * (1.0 - tau) / (tnrow * NZD(dens.q)^2)
          myout$yqerr <- sqrt(pmax(qvar, 0.0))
          myout$yqerr[!is.finite(myout$yqerr)] <- NA_real_
        }
      }

      if (gradients) {
        myout$yqgrad <- matrix(data = myout$yqgrad, nrow = enrow, ncol = bws$xndim, byrow = FALSE)
        rorder <- numeric(bws$xndim)
        xidx <- seq_len(bws$xndim)
        rorder[c(xidx[bws$ixcon], xidx[bws$ixuno], xidx[bws$ixord])] <- xidx
        myout$yqgrad <- myout$yqgrad[, rorder, drop = FALSE]
      } else {
        myout$yqgrad <- NA
      }

      fit.elapsed <- proc.time()[3] - fit.start
      optim.time <- if (!is.null(bws$total.time) && is.finite(bws$total.time)) as.double(bws$total.time) else NA_real_
      total.time <- fit.elapsed + if (is.na(optim.time)) 0.0 else optim.time

      qregression(
        bws = bws,
        xeval = txeval,
        tau = tau,
        quantile = myout$yq,
        quanterr = myout$yqerr,
        quantgrad = myout$yqgrad,
        ntrain = tnrow,
        trainiseval = no.ex,
        gradients = gradients,
        timing = bws$timing,
        total.time = total.time,
        optim.time = optim.time,
        fit.time = fit.elapsed
      )
    }
  )
}

.np_plot_conditional_eval <- function(bws,
                                      xdat,
                                      ydat,
                                      exdat,
                                      eydat,
                                      cdf = FALSE,
                                      gradients = FALSE,
                                      proper = FALSE,
                                      proper.method = NULL,
                                      proper.control = list()) {
  activity <- .np_plot_activity_begin(
    if (isTRUE(cdf)) {
      "Computing conditional distribution plot fit"
    } else {
      "Computing conditional density plot fit"
    }
  )
  on.exit(.np_plot_activity_end(activity), add = TRUE)
  fit.start <- proc.time()[3]
  proper <- npValidateScalarLogical(proper, "proper")

  xdat <- toFrame(xdat)
  ydat <- toFrame(ydat)
  exdat <- toFrame(exdat)
  eydat <- toFrame(eydat)

  if (nrow(xdat) != nrow(ydat))
    stop("conditional plot helper requires aligned training rows")
  if (nrow(exdat) != nrow(eydat))
    stop("conditional plot helper requires aligned evaluation rows")
  if (!xdat %~% exdat)
    stop("'xdat' and 'exdat' are not similar data frames!")
  if (!ydat %~% eydat)
    stop("'ydat' and 'eydat' are not similar data frames!")

  xdat <- adjustLevels(xdat, bws$xdati)
  ydat <- adjustLevels(ydat, bws$ydati)
  exdat <- adjustLevels(exdat, bws$xdati, allowNewCells = TRUE)
  eydat <- adjustLevels(eydat, bws$ydati, allowNewCells = TRUE)
  npKernelBoundsCheckEval(exdat, bws$ixcon, bws$cxkerlb, bws$cxkerub, argprefix = "cxker")
  npKernelBoundsCheckEval(eydat, bws$iycon, bws$cykerlb, bws$cykerub, argprefix = "cyker")

  txeval <- exdat
  tyeval <- eydat
  tnrow <- nrow(xdat)
  enrow <- nrow(exdat)

  ydat <- toMatrix(ydat)
  tyuno <- ydat[, bws$iyuno, drop = FALSE]
  tycon <- ydat[, bws$iycon, drop = FALSE]
  tyord <- ydat[, bws$iyord, drop = FALSE]

  xdat <- toMatrix(xdat)
  txuno <- xdat[, bws$ixuno, drop = FALSE]
  txcon <- xdat[, bws$ixcon, drop = FALSE]
  txord <- xdat[, bws$ixord, drop = FALSE]

  eydat <- toMatrix(eydat)
  eyuno <- eydat[, bws$iyuno, drop = FALSE]
  eycon <- eydat[, bws$iycon, drop = FALSE]
  eyord <- eydat[, bws$iyord, drop = FALSE]

  exdat <- toMatrix(exdat)
  exuno <- exdat[, bws$ixuno, drop = FALSE]
  excon <- exdat[, bws$ixcon, drop = FALSE]
  exord <- exdat[, bws$ixord, drop = FALSE]

  reg.engine <- if (is.null(bws$regtype.engine)) {
    if (is.null(bws$regtype)) "lc" else as.character(bws$regtype)
  } else {
    as.character(bws$regtype.engine)
  }
  basis.engine <- if (is.null(bws$basis.engine)) {
    if (is.null(bws$basis)) "glp" else bws$basis
  } else {
    bws$basis.engine
  }
  degree.engine <- if (is.null(bws$degree.engine)) {
    if (bws$xncon > 0L) {
      if (identical(reg.engine, "lc")) rep.int(0L, bws$xncon) else npValidateGlpDegree(
        regtype = "lp",
        degree = bws$degree,
        ncon = bws$xncon
      )
    } else {
      integer(0)
    }
  } else {
    as.integer(bws$degree.engine)
  }
  bernstein.engine <- if (is.null(bws$bernstein.basis.engine)) {
    isTRUE(bws$bernstein.basis)
  } else {
    isTRUE(bws$bernstein.basis.engine)
  }

  reg.c <- npRegtypeToC(
    regtype = if (identical(reg.engine, "lp")) "lp" else "lc",
    degree = degree.engine,
    ncon = bws$xncon,
    context = if (isTRUE(cdf)) "npcdist" else "npcdens"
  )
  degree.c <- if (bws$xncon > 0L) {
    as.integer(if (is.null(reg.c$degree)) rep.int(0L, bws$xncon) else reg.c$degree)
  } else {
    integer(0)
  }
  basis.code <- as.integer(npLpBasisCode(basis.engine))

  myopti <- list(
    num_obs_train = tnrow,
    num_obs_eval = enrow,
    int_LARGE_SF = if (bws$scaling) SF_NORMAL else SF_ARB,
    BANDWIDTH_den_extern = switch(bws$type,
      fixed = BW_FIXED,
      generalized_nn = BW_GEN_NN,
      adaptive_nn = BW_ADAP_NN
    ),
    int_MINIMIZE_IO = if (isTRUE(getOption("np.messages"))) IO_MIN_FALSE else IO_MIN_TRUE,
    xkerneval = switch(bws$cxkertype,
      gaussian = CKER_GAUSS + bws$cxkerorder / 2 - 1,
      epanechnikov = CKER_EPAN + bws$cxkerorder / 2 - 1,
      uniform = CKER_UNI,
      "truncated gaussian" = CKER_TGAUSS
    ),
    ykerneval = switch(bws$cykertype,
      gaussian = CKER_GAUSS + bws$cykerorder / 2 - 1,
      epanechnikov = CKER_EPAN + bws$cykerorder / 2 - 1,
      uniform = CKER_UNI,
      "truncated gaussian" = CKER_TGAUSS
    ),
    uxkerneval = switch(bws$uxkertype,
      aitchisonaitken = UKER_AIT,
      liracine = UKER_LR
    ),
    uykerneval = switch(bws$uykertype,
      aitchisonaitken = UKER_AIT,
      liracine = UKER_LR
    ),
    oxkerneval = switch(bws$oxkertype,
      wangvanryzin = OKER_WANG,
      liracine = OKER_NLR,
      racineliyan = OKER_RLY
    ),
    oykerneval = switch(bws$oykertype,
      wangvanryzin = OKER_WANG,
      liracine = OKER_NLR,
      racineliyan = OKER_RLY
    ),
    num_yuno = bws$ynuno,
    num_yord = bws$ynord,
    num_ycon = bws$yncon,
    num_xuno = bws$xnuno,
    num_xord = bws$xnord,
    num_xcon = bws$xncon,
    no.exy = FALSE,
    gradients = gradients,
    ymcv.numRow = attr(bws$ymcv, "num.row"),
    xmcv.numRow = attr(bws$xmcv, "num.row"),
    densOrDist = if (isTRUE(cdf)) NP_DO_DIST else NP_DO_DENS,
    int_do_tree = if (isTRUE(getOption("np.tree"))) DO_TREE_YES else DO_TREE_NO
  )

  cxker.bounds.c <- npKernelBoundsMarshal(bws$cxkerlb[bws$ixcon], bws$cxkerub[bws$ixcon])
  cyker.bounds.c <- npKernelBoundsMarshal(bws$cykerlb[bws$iycon], bws$cykerub[bws$iycon])

  myout <- .Call(
    "C_np_density_conditional",
    as.double(tyuno), as.double(tyord), as.double(tycon),
    as.double(txuno), as.double(txord), as.double(txcon),
    as.double(eyuno), as.double(eyord), as.double(eycon),
    as.double(exuno), as.double(exord), as.double(excon),
    as.double(c(
      bws$xbw[bws$ixcon], bws$ybw[bws$iycon],
      bws$ybw[bws$iyuno], bws$ybw[bws$iyord],
      bws$xbw[bws$ixuno], bws$xbw[bws$ixord]
    )),
    as.double(bws$ymcv), as.double(attr(bws$ymcv, "pad.num")),
    as.double(bws$xmcv), as.double(attr(bws$xmcv, "pad.num")),
    as.double(bws$nconfac), as.double(bws$ncatfac), as.double(bws$sdev),
    as.integer(myopti),
    as.integer(enrow),
    as.integer(bws$xndim),
    as.double(cxker.bounds.c$lb),
    as.double(cxker.bounds.c$ub),
    as.double(cyker.bounds.c$lb),
    as.double(cyker.bounds.c$ub),
    as.integer(reg.c$code),
    as.integer(degree.c),
    as.integer(bernstein.engine),
    basis.code,
    PACKAGE = "np"
  )

  if (isTRUE(cdf))
    names(myout)[1L] <- "condist"

  if (isTRUE(gradients)) {
    xidx <- seq_len(bws$xndim)
    rorder <- numeric(bws$xndim)
    rorder[c(xidx[bws$ixcon], xidx[bws$ixuno], xidx[bws$ixord])] <- xidx
    myout$congrad <- matrix(data = myout$congrad, nrow = enrow, ncol = bws$xndim, byrow = FALSE)
    myout$congrad <- myout$congrad[, rorder, drop = FALSE]
    myout$congerr <- matrix(data = myout$congerr, nrow = enrow, ncol = bws$xndim, byrow = FALSE)
    myout$congerr <- myout$congerr[, rorder, drop = FALSE]
  } else {
    myout$congrad <- NA
    myout$congerr <- NA
  }

  fit.elapsed <- proc.time()[3] - fit.start
  optim.time <- if (!is.null(bws$total.time) && is.finite(bws$total.time)) as.double(bws$total.time) else NA_real_
  total.time <- fit.elapsed + if (is.na(optim.time)) 0.0 else optim.time

  if (isTRUE(cdf)) {
    out <- condistribution(
      bws = bws,
      xeval = txeval,
      yeval = tyeval,
      condist = myout$condist,
      conderr = myout$conderr,
      congrad = myout$congrad,
      congerr = myout$congerr,
      ntrain = tnrow,
      trainiseval = FALSE,
      gradients = gradients,
      rows.omit = integer(0),
      timing = bws$timing,
      total.time = total.time,
      optim.time = optim.time,
      fit.time = fit.elapsed
    )

    if (isTRUE(proper)) {
      .np_condist_finalize_proper_object(
        object = out,
        proper = TRUE,
        proper.method = proper.method,
        proper.control = proper.control,
        where = "plot()"
      )
    } else {
      out
    }
  } else {
    out <- condensity(
      bws = bws,
      xeval = txeval,
      yeval = tyeval,
      condens = myout$condens,
      conderr = myout$conderr,
      congrad = myout$congrad,
      congerr = myout$congerr,
      ll = myout$log_likelihood,
      ntrain = tnrow,
      trainiseval = FALSE,
      gradients = gradients,
      rows.omit = integer(0),
      timing = bws$timing,
      total.time = total.time,
      optim.time = optim.time,
      fit.time = fit.elapsed
    )

    if (isTRUE(proper)) {
      .np_condens_finalize_proper_object(
        object = out,
        proper = TRUE,
        proper.method = proper.method,
        proper.control = proper.control,
        where = "plot()"
      )
    } else {
      out
    }
  }
}

## Rank-based simultaneous confidence set helper, vendored from
## MCPAN::SCSrank (MCPAN 1.1-21, GPL-2; Schaarschmidt, Gerhard, Sill).
np.plot.SCSrank <- function(x,
                            conf.level = 0.95,
                            alternative = "two.sided",
                            progress_tick = NULL,
                            progress_offset = 0L,
                            ...) {
  alternative <- match.arg(alternative, choices = c("two.sided", "less", "greater"))

  DataMatrix <- x
  N <- nrow(DataMatrix)
  K <- ncol(DataMatrix)
  k <- round(conf.level * N, 0)
  row.max <- rep.int(-Inf, N)
  row.min <- rep.int(Inf, N)

  for (j in seq_len(K)) {
    ranks.j <- rank(DataMatrix[, j])
    row.max <- pmax(row.max, ranks.j)
    row.min <- pmin(row.min, ranks.j)
    if (is.function(progress_tick))
      progress_tick(progress_offset + j)
  }

  SCS <- matrix(NA_real_, nrow = K, ncol = 2L)

  switch(alternative,
    "two.sided" = {
      tstar <- round(sort.int(pmax(row.max, N + 1 - row.min))[k], 0)
      lower.idx <- N + 1 - tstar
      upper.idx <- tstar
      for (j in seq_len(K)) {
        sortx <- sort.int(DataMatrix[, j])
        SCS[j, ] <- c(sortx[lower.idx], sortx[upper.idx])
        if (is.function(progress_tick))
          progress_tick(progress_offset + K + j)
      }
    },
    "less" = {
      tstar <- round(sort.int(row.max)[k], 0)
      for (j in seq_len(K)) {
        sortx <- sort.int(DataMatrix[, j])
        SCS[j, ] <- c(-Inf, sortx[tstar])
        if (is.function(progress_tick))
          progress_tick(progress_offset + K + j)
      }
    },
    "greater" = {
      tstar <- round(sort.int(N + 1 - row.min)[k], 0)
      lower.idx <- N + 1 - tstar
      for (j in seq_len(K)) {
        sortx <- sort.int(DataMatrix[, j])
        SCS[j, ] <- c(sortx[lower.idx], Inf)
        if (is.function(progress_tick))
          progress_tick(progress_offset + K + j)
      }
    }
  )

  colnames(SCS) <- c("lower", "upper")

  attr(SCS, which = "k") <- k
  attr(SCS, which = "N") <- N
  OUT <- list(conf.int = SCS, conf.level = conf.level, alternative = alternative)
  return(OUT)
}

.np_plot_quantile_type7_sorted <- function(sorted.x, probs) {
  n <- length(sorted.x)
  probs <- pmin(pmax(as.double(probs), 0), 1)
  if (n < 1L)
    return(rep.int(NA_real_, length(probs)))

  h <- 1 + (n - 1) * probs
  lo <- floor(h)
  hi <- ceiling(h)
  q <- sorted.x[lo] + (h - lo) * (sorted.x[hi] - sorted.x[lo])
  q[probs <= 0] <- sorted.x[1L]
  q[probs >= 1] <- sorted.x[n]
  q
}

.np_plot_quantile_bounds_multi <- function(boot.t, probs.list, progress_tick = NULL, progress_offset = 0L) {
  probs.list <- unclass(probs.list)
  if (!length(probs.list))
    return(list())

  neval <- ncol(boot.t)
  row.names <- colnames(boot.t)
  out <- lapply(probs.list, function(probs) {
    prob.names <- names(stats::quantile(c(0, 1), probs = probs))
    matrix(NA_real_, nrow = neval, ncol = length(probs),
           dimnames = list(row.names, prob.names))
  })
  names(out) <- names(probs.list)

  for (j in seq_len(neval)) {
    sorted.j <- sort.int(boot.t[, j])
    for (nm in names(probs.list)) {
      out[[nm]][j, ] <- .np_plot_quantile_type7_sorted(sorted.j, probs.list[[nm]])
    }
    if (is.function(progress_tick))
      progress_tick(progress_offset + j)
  }

  out
}

.np_plot_quantile_bounds_single <- function(boot.t, probs, progress_tick = NULL, progress_offset = 0L) {
  neval <- ncol(boot.t)
  out <- matrix(NA_real_, nrow = neval, ncol = length(probs))
  row.names <- colnames(boot.t)
  if (!is.null(row.names))
    rownames(out) <- row.names
  colnames(out) <- names(stats::quantile(c(0, 1), probs = probs))

  for (j in seq_len(neval)) {
    out[j, ] <- stats::quantile(boot.t[, j], probs = probs)
    if (is.function(progress_tick))
      progress_tick(progress_offset + j)
  }

  out
}

compute.bootstrap.quantile.bounds <- function(boot.t,
                                              alpha,
                                              band.type,
                                              warn.coverage = TRUE,
                                              progress_tick = NULL,
                                              progress_offset = 0L) {
  B <- nrow(boot.t)
  neval <- ncol(boot.t)

  .np_plot_bootstrap_tail_warning <- function(B, alpha, band.type, neval) {
    m <- if (identical(band.type, "pointwise")) 1L else max(1L, as.integer(neval))
    min.B <- ceiling((2.0 * m) / alpha - 1.0)
    if (B >= min.B)
      return(invisible(NULL))

    m.desc <- if (m == 1L) {
      "m=1 (pointwise tails)"
    } else {
      sprintf("m=n.eval=%d (Bonferroni-conservative tails)", neval)
    }
    .np_warning(sprintf(
      paste0("plot.errors.boot.num=%d is too small for plot.errors.type='%s' ",
             "(alpha=%g). Minimum recommended is %d using ",
             "B >= ceiling(2*m/alpha - 1), with %s. ",
             "For 2D perspective plots on a full neval x neval grid, m=neval^2."),
      B, band.type, alpha, min.B, m.desc
    ), call. = FALSE)
  }

  if (isTRUE(warn.coverage) && band.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
    warn.type <- if (identical(band.type, "all")) "bonferroni/simultaneous/all" else band.type
    .np_plot_bootstrap_tail_warning(B = B, alpha = alpha, band.type = warn.type, neval = neval)
  }

  if (band.type == "pointwise") {
    return(.np_plot_quantile_bounds_single(
      boot.t = boot.t,
      probs = c(alpha / 2.0, 1.0 - alpha / 2.0),
      progress_tick = progress_tick,
      progress_offset = progress_offset
    ))
  }

  if (band.type == "bonferroni") {
    return(.np_plot_quantile_bounds_single(
      boot.t = boot.t,
      probs = c(alpha / (2.0 * neval), 1.0 - alpha / (2.0 * neval)),
      progress_tick = progress_tick,
      progress_offset = progress_offset
    ))
  }

  if (band.type == "simultaneous") {
    return(np.plot.SCSrank(
      boot.t,
      conf.level = 1.0 - alpha,
      progress_tick = progress_tick,
      progress_offset = progress_offset
    )$conf.int)
  }

  if (band.type == "all") {
    quantile.bounds <- .np_plot_quantile_bounds_multi(
      boot.t = boot.t,
      probs.list = list(
        pointwise = c(alpha / 2.0, 1.0 - alpha / 2.0),
        bonferroni = c(alpha / (2.0 * neval), 1.0 - alpha / (2.0 * neval))
      ),
      progress_tick = progress_tick,
      progress_offset = progress_offset
    )
    return(list(
      pointwise = quantile.bounds$pointwise,
      bonferroni = quantile.bounds$bonferroni,
      simultaneous = compute.bootstrap.quantile.bounds(
        boot.t,
        alpha,
        "simultaneous",
        warn.coverage = FALSE,
        progress_tick = progress_tick,
        progress_offset = progress_offset + neval
      )
    ))
  }

  stop("'band.type' must be one of pointwise, bonferroni, simultaneous, all")
}

.np_plot_bootstrap_interval_summary <- function(boot.t,
                                                t0,
                                                alpha,
                                                band.type,
                                                progress.label = NULL) {
  if (!(band.type %in% c("pointwise", "bonferroni", "simultaneous", "all")))
    stop("'band.type' must be one of pointwise, bonferroni, simultaneous, all")

  neval <- max(1L, ncol(boot.t))
  progress.total <- switch(
    band.type,
    pointwise = neval,
    bonferroni = neval,
    simultaneous = 2L * neval,
    all = 3L * neval
  )
  progress <- .np_plot_stage_progress_begin(
    total = progress.total,
    label = if (is.null(progress.label)) sprintf("Constructing bootstrap %s bands", band.type) else progress.label
  )
  on.exit(.np_plot_progress_end(progress), add = TRUE)
  progress_tick <- local({
    function(done) {
      progress <<- .np_plot_progress_tick(state = progress, done = done)
      invisible(NULL)
    }
  })

  if (identical(band.type, "all")) {
    all.bounds <- compute.bootstrap.quantile.bounds(
      boot.t = boot.t,
      alpha = alpha,
      band.type = "all",
      progress_tick = progress_tick
    )
    bounds <- all.bounds$pointwise
    all.err <- lapply(all.bounds, function(bb) {
      cbind(t0 - bb[, 1L], bb[, 2L] - t0)
    })
  } else {
    bounds <- compute.bootstrap.quantile.bounds(
      boot.t = boot.t,
      alpha = alpha,
      band.type = band.type,
      progress_tick = progress_tick
    )
    all.err <- NULL
  }

  list(
    err = cbind(t0 - bounds[, 1L], bounds[, 2L] - t0),
    all.err = all.err
  )
}

.np_plot_bootstrap_col_sds <- function(boot.t) {
  boot.t <- as.matrix(boot.t)
  B <- nrow(boot.t)
  if (B <= 1L)
    return(rep.int(0.0, ncol(boot.t)))

  mu <- colMeans(boot.t)
  sqrt(colSums((sweep(boot.t, 2L, mu, "-"))^2) / (B - 1L))
}

.np_plot_asymptotic_error_from_se <- function(se, alpha, band.type, m = length(se)) {
  se <- as.numeric(se)
  n <- length(se)
  m <- max(1L, as.integer(m[1L]))

  if (!length(se))
    return(list(err = matrix(numeric(0), nrow = 0L, ncol = 2L), all.err = NULL))

  make_err <- function(mult) {
    cbind(mult * se, mult * se)
  }

  if (band.type == "all") {
    err.pointwise <- make_err(qnorm(alpha / 2.0, lower.tail = FALSE))
    err.bonf <- make_err(qnorm(alpha / (2.0 * m), lower.tail = FALSE))
    err.sim <- matrix(NA_real_, nrow = n, ncol = 2L)
    return(list(
      err = err.pointwise,
      all.err = list(
        pointwise = err.pointwise,
        simultaneous = err.sim,
        bonferroni = err.bonf
      )
    ))
  }

  if (band.type == "simultaneous")
    return(list(err = matrix(NA_real_, nrow = n, ncol = 2L), all.err = NULL))

  mult <- if (band.type == "bonferroni") {
    qnorm(alpha / (2.0 * m), lower.tail = FALSE)
  } else if (band.type %in% c("pmzsd", "pointwise")) {
    qnorm(alpha / 2.0, lower.tail = FALSE)
  } else {
    stop("unsupported asymptotic interval type")
  }

  list(err = make_err(mult), all.err = NULL)
}

compute.all.error.range <- function(center, all.err) {
  if (is.null(all.err)) {
    return(c(NA_real_, NA_real_))
  }
  lower <- c(center - all.err$pointwise[,1],
             center - all.err$simultaneous[,1],
             center - all.err$bonferroni[,1])
  upper <- c(center + all.err$pointwise[,2],
             center + all.err$simultaneous[,2],
             center + all.err$bonferroni[,2])
  rng <- c(min(lower, na.rm = TRUE), max(upper, na.rm = TRUE))
  if (all(is.finite(rng)))
    return(rng)

  center <- center[is.finite(center)]
  if (!length(center))
    return(c(NA_real_, NA_real_))
  range(center, finite = TRUE)
}

compute.default.error.range <- function(center, err) {
  lower <- c(center - err[,1], err[,3] - err[,1])
  upper <- c(center + err[,2], err[,3] + err[,2])
  rng <- c(min(lower, na.rm = TRUE), max(upper, na.rm = TRUE))
  if (all(is.finite(rng)))
    return(rng)

  center <- center[is.finite(center)]
  if (!length(center))
    return(c(NA_real_, NA_real_))
  range(center, finite = TRUE)
}

.np_plot_normalize_common_options <- function(plot.behavior,
                                             plot.errors.method,
                                             plot.errors.boot.method,
                                             plot.errors.boot.nonfixed = c("exact", "frozen"),
                                             plot.errors.boot.wild = c("rademacher", "mammen"),
                                             plot.errors.boot.blocklen,
                                             plot.errors.center,
                                             plot.errors.type,
                                             plot.errors.alpha,
                                             plot.errors.style,
                                             plot.errors.bar,
                                             xdat,
                                             common.scale,
                                             ylim,
                                             allow_asymptotic_quantile = TRUE) {
  scalar_choice <- function(value, default) {
    if (is.null(value) || length(value) < 1L || is.na(value[1L])) default else value[1L]
  }

  plot.behavior <- match.arg(
    scalar_choice(plot.behavior, "plot"),
    c("plot", "plot-data", "data")
  )
  plot.errors.method <- match.arg(
    scalar_choice(plot.errors.method, "none"),
    c("none", "bootstrap", "asymptotic")
  )
  plot.errors.boot.method <- match.arg(
    scalar_choice(plot.errors.boot.method, "wild"),
    c("wild", "inid", "fixed", "geom")
  )
  plot.errors.boot.nonfixed <- match.arg(
    scalar_choice(plot.errors.boot.nonfixed, "exact"),
    c("exact", "frozen")
  )
  plot.errors.boot.wild <- match.arg(
    scalar_choice(plot.errors.boot.wild, "rademacher"),
    c("rademacher", "mammen")
  )
  plot.errors.center <- match.arg(
    scalar_choice(plot.errors.center, "estimate"),
    c("estimate", "bias-corrected")
  )
  plot.errors.type <- match.arg(
    scalar_choice(plot.errors.type, "simultaneous"),
    c("simultaneous", "pointwise", "bonferroni", "pmzsd", "all")
  )

  if (!is.numeric(plot.errors.alpha) || length(plot.errors.alpha) != 1 ||
      is.na(plot.errors.alpha) || plot.errors.alpha <= 0 || plot.errors.alpha >= 0.5)
    stop("the tail probability plot.errors.alpha must lie in (0,0.5)")

  plot.errors.style <- match.arg(
    scalar_choice(plot.errors.style, "band"),
    c("band", "bar")
  )
  plot.errors.bar <- match.arg(
    scalar_choice(plot.errors.bar, "|"),
    c("|", "I")
  )

  common.scale <- common.scale | (!is.null(ylim))

  if (plot.errors.method == "none" && plot.errors.type == "all") {
    .np_warning("plot.errors.type='all' requires bootstrap errors; setting plot.errors.method='bootstrap'")
    plot.errors.method <- "bootstrap"
  }

  if (allow_asymptotic_quantile && plot.errors.method == "asymptotic") {
    if (plot.errors.type == "simultaneous")
      .np_warning("asymptotic simultaneous confidence bands are unavailable here; returning NA interval limits")
    if (plot.errors.type == "all")
      .np_warning("asymptotic simultaneous confidence bands are unavailable here; 'all' returns pointwise/bonferroni and NA simultaneous")

    if (plot.errors.center == "bias-corrected") {
      .np_warning("no bias corrections can be calculated with asymptotics, centering on estimate")
      plot.errors.center <- "estimate"
    }
  }

  if (is.element(plot.errors.boot.method, c("fixed", "geom")) &&
      is.null(plot.errors.boot.blocklen))
    plot.errors.boot.blocklen <- b.star(xdat, round = TRUE)[1,1]

  list(
    plot.behavior = plot.behavior,
    plot.errors.method = plot.errors.method,
    plot.errors.boot.method = plot.errors.boot.method,
    plot.errors.boot.nonfixed = plot.errors.boot.nonfixed,
    plot.errors.boot.wild = plot.errors.boot.wild,
    plot.errors.boot.blocklen = plot.errors.boot.blocklen,
    plot.errors.center = plot.errors.center,
    plot.errors.type = plot.errors.type,
    plot.errors.alpha = plot.errors.alpha,
    plot.errors.style = plot.errors.style,
    plot.errors.bar = plot.errors.bar,
    common.scale = common.scale,
    plot.errors = (plot.errors.method != "none")
  )
}


compute.bootstrap.errors = function(...,bws){
  UseMethod("compute.bootstrap.errors",bws)
}

compute.bootstrap.errors.rbandwidth =
  function(xdat, ydat,
           exdat,
           gradients,
           gradient.order,
           slice.index,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.wild = c("rademacher", "mammen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           progress.target = NULL,
           ...,
           bws){
    prep.label <- .np_plot_bootstrap_stage_label(
      stage = "Preparing plot bootstrap",
      method_label = plot.errors.boot.method,
      target_label = progress.target
    )
    progress.label <- .np_plot_bootstrap_stage_label(
      stage = "Plot bootstrap",
      method_label = NULL,
      target_label = progress.target
    )
    interval.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Constructing bootstrap %s bands", plot.errors.type),
      target_label = progress.target
    )

    activity <- .np_plot_activity_begin(prep.label)
    on.exit(.np_plot_activity_end(activity), add = TRUE)
    .np_plot_require_bws(bws = bws, where = "compute.bootstrap.errors.rbandwidth")
    boot.out <- NULL

    boot.err = matrix(data = NA, nrow = dim(exdat)[1], ncol = 3)
    boot.all.err <- NULL
    is.wild.hat <- .np_plot_is_wild_method(plot.errors.boot.method)
    is.inid <- plot.errors.boot.method == "inid"
    is.block <- is.element(plot.errors.boot.method, c("fixed", "geom"))
    use.frozen.nonfixed <- identical(plot.errors.boot.nonfixed, "frozen") &&
      !identical(bws$type, "fixed")

    cont.idx <- which(bws$xdati$icon)
    xi.factor <- isTRUE(slice.index > 0L) &&
      (isTRUE(bws$xdati$iord[slice.index]) || isTRUE(bws$xdati$iuno[slice.index]))
    if (is.wild.hat && gradients && !xi.factor && is.na(match(slice.index, cont.idx))) {
      stop("plot.errors.boot.method='wild' supports gradients only for continuous or categorical slices in compute.bootstrap.errors.rbandwidth", call. = FALSE)
    }

    inid.helper.ok <- TRUE
    block.helper.ok <- TRUE

    if ((is.inid && isTRUE(inid.helper.ok)) || (is.block && isTRUE(block.helper.ok))) {
      counts.drawer <- if (is.block) {
        .np_block_counts_drawer(
          n = nrow(xdat),
          B = plot.errors.boot.num,
          blocklen = plot.errors.boot.blocklen,
          sim = plot.errors.boot.method
        )
      } else {
        NULL
      }
      boot.out <- tryCatch(
        if (identical(bws$type, "fixed")) {
          .np_inid_boot_from_regression(
            xdat = xdat,
            exdat = exdat,
            bws = bws,
            ydat = ydat,
            B = plot.errors.boot.num,
            counts.drawer = counts.drawer,
            gradients = gradients,
            gradient.order = gradient.order,
            slice.index = slice.index,
            prep.label = prep.label,
            progress.label = progress.label
          )
        } else if (use.frozen.nonfixed) {
          .np_inid_boot_from_reghat_frozen(
            xdat = xdat,
            exdat = exdat,
            bws = bws,
            ydat = ydat,
            B = plot.errors.boot.num,
            counts.drawer = counts.drawer,
            gradients = gradients,
            gradient.order = gradient.order,
            slice.index = slice.index,
            prep.label = prep.label,
            progress.label = progress.label
          )
        } else {
          .np_inid_boot_from_reghat_exact(
            xdat = xdat,
            exdat = exdat,
            bws = bws,
            ydat = ydat,
            B = plot.errors.boot.num,
            counts.drawer = counts.drawer,
            gradients = gradients,
            gradient.order = gradient.order,
            slice.index = slice.index,
            progress.label = progress.label
          )
        },
        error = function(e) {
          stop(sprintf("%s regression helper failed in compute.bootstrap.errors.rbandwidth (%s)",
                       if (is.block) plot.errors.boot.method else "inid",
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }

    if (is.null(boot.out) && is.wild.hat) {
      plot.errors.boot.wild <- .np_plot_normalize_wild(plot.errors.boot.wild)

      fit.mean <- as.vector(suppressWarnings(npreghat(
        bws = bws,
        txdat = xdat,
        exdat = xdat,
        y = ydat,
        output = "apply"
      )))

      s.vec <- NULL
      if (gradients && !xi.factor) {
        cpos <- match(slice.index, cont.idx)
        gorder <- if (length(gradient.order) == 1L) {
          rep.int(as.integer(gradient.order), length(cont.idx))
        } else {
          as.integer(gradient.order)
        }
        if (length(gorder) != length(cont.idx))
          gorder <- rep.int(1L, length(cont.idx))
        s.vec <- integer(length(cont.idx))
        s.vec[cpos] <- gorder[cpos]
      }

      H <- suppressWarnings(npreghat(
        bws = bws,
        txdat = xdat,
        exdat = exdat,
        s = s.vec,
        output = "matrix"
      ))

      boot.out <- if (gradients && xi.factor) {
        .np_plot_boot_from_hat_wild_factor_effects(
          H = H,
          ydat = ydat,
          fit.mean = fit.mean,
          B = plot.errors.boot.num,
          wild = plot.errors.boot.wild,
          progress.label = progress.label
        )
      } else {
        .np_plot_boot_from_hat_wild(
          H = H,
          ydat = ydat,
          fit.mean = fit.mean,
          B = plot.errors.boot.num,
          wild = plot.errors.boot.wild,
          progress.label = progress.label
        )
      }
    }

    if (is.null(boot.out))
      stop(sprintf("unresolved bootstrap execution path for method '%s' in compute.bootstrap.errors.rbandwidth", plot.errors.boot.method), call. = FALSE)

    all.bp <- .np_plot_boot_factor_boxplots(
      boot.t = boot.out$t,
      tdati = bws$xdati,
      ti = slice.index,
      B = plot.errors.boot.num
    )
    
    if (plot.errors.type == "pmzsd") {
      pmz.progress <- .np_plot_stage_progress_begin(
        total = 2L,
        label = "Computing bootstrap pmzsd errors"
      )
      on.exit(.np_plot_progress_end(pmz.progress), add = TRUE)
      boot.sd <- .np_plot_bootstrap_col_sds(boot.out$t)
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 1L, force = TRUE)
      boot.err[,1:2] = qnorm(plot.errors.alpha/2, lower.tail = FALSE) * boot.sd
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 2L, force = TRUE)
    }
    else if (plot.errors.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
      interval.summary <- .np_plot_bootstrap_interval_summary(
        boot.t = boot.out$t,
        t0 = boot.out$t0,
        alpha = plot.errors.alpha,
        band.type = plot.errors.type,
        progress.label = interval.label
      )
      boot.err[,1:2] <- interval.summary$err
      boot.all.err <- interval.summary$all.err
    }
    if (plot.errors.center == "bias-corrected")
      boot.err[,3] <- 2*boot.out$t0-colMeans(boot.out$t)
    list(boot.err = boot.err, bxp = all.bp, boot.all.err = boot.all.err)
  }

compute.bootstrap.errors.scbandwidth =
  function(xdat, ydat, zdat,
           exdat, ezdat,
           gradients,
           slice.index,
           progress.target = NULL,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.wild = c("rademacher", "mammen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           ...,
           bws){
    if (is.null(progress.target)) {
      progress.target <- .np_plot_scoef_bootstrap_target_label(
        bws = bws,
        slice.index = slice.index
      )
    }
    prep.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Preparing plot bootstrap %s", plot.errors.boot.method),
      target_label = progress.target
    )
    progress.label <- .np_plot_bootstrap_stage_label(
      stage = "Plot bootstrap",
      target_label = progress.target
    )
    interval.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Constructing bootstrap %s bands", plot.errors.type),
      target_label = progress.target
    )
    activity <- .np_plot_activity_begin(
      prep.label
    )
    on.exit(.np_plot_activity_end(activity), add = TRUE)
    .np_plot_require_bws(bws = bws, where = "compute.bootstrap.errors.scbandwidth")
    miss.z <- missing(zdat)
    boot.err = matrix(data = NA, nrow = dim(exdat)[1], ncol = 3)
    boot.all.err <- NULL

    is.wild.hat <- .np_plot_is_wild_method(plot.errors.boot.method)
    is.inid <- plot.errors.boot.method == "inid"
    is.block <- is.element(plot.errors.boot.method, c("fixed", "geom"))
    use.frozen.nonfixed <- identical(plot.errors.boot.nonfixed, "frozen") &&
      !identical(bws$type, "fixed")
    helper.mode <- if (isTRUE(use.frozen.nonfixed)) "frozen" else "exact"
    boot.out <- NULL

    if (is.inid) {
      if (isTRUE(gradients))
        stop("inid bootstrap for smooth coefficient gradients is not supported in helper mode", call. = FALSE)
      boot.out <- tryCatch(
        .np_inid_boot_from_scoef(
          txdat = xdat,
          ydat = ydat,
          tzdat = if (miss.z) NULL else zdat,
          exdat = exdat,
          ezdat = if (miss.z) NULL else ezdat,
          bws = bws,
          B = plot.errors.boot.num,
          leave.one.out = FALSE,
          progress.label = progress.label,
          mode = helper.mode
        ),
        error = function(e) {
          stop(sprintf("inid smooth coefficient helper failed in compute.bootstrap.errors.scbandwidth (%s)",
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }
    if (is.null(boot.out) && is.block) {
      if (isTRUE(gradients))
        stop("fixed/geom bootstrap for smooth coefficient gradients is not supported in helper mode", call. = FALSE)
      counts.drawer <- .np_block_counts_drawer(
        n = nrow(xdat),
        B = plot.errors.boot.num,
        blocklen = plot.errors.boot.blocklen,
        sim = plot.errors.boot.method
      )
      boot.out <- tryCatch(
        .np_inid_boot_from_scoef(
          txdat = xdat,
          ydat = ydat,
          tzdat = if (miss.z) NULL else zdat,
          exdat = exdat,
          ezdat = if (miss.z) NULL else ezdat,
          bws = bws,
          B = plot.errors.boot.num,
          counts.drawer = counts.drawer,
          leave.one.out = FALSE,
          progress.label = progress.label,
          mode = helper.mode
        ),
        error = function(e) {
          stop(sprintf("%s smooth coefficient helper failed in compute.bootstrap.errors.scbandwidth (%s)",
                       plot.errors.boot.method,
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }

    if (is.null(boot.out) && is.wild.hat) {
      plot.errors.boot.wild <- .np_plot_normalize_wild(plot.errors.boot.wild)

      hat.eval.args <- list(
        bws = bws,
        txdat = xdat,
        exdat = exdat,
        output = "matrix",
        iterate = FALSE
      )
      hat.train.args <- list(
        bws = bws,
        txdat = xdat,
        exdat = xdat,
        y = ydat,
        output = "apply",
        iterate = FALSE
      )
      if (!miss.z) {
        hat.eval.args$tzdat <- zdat
        hat.eval.args$ezdat <- ezdat
        hat.train.args$tzdat <- zdat
        hat.train.args$ezdat <- zdat
      }

      fit.mean <- as.vector(do.call(npscoefhat, hat.train.args))
      H <- do.call(npscoefhat, hat.eval.args)

      boot.out <- .np_plot_boot_from_hat_wild(
        H = H,
        ydat = ydat,
        fit.mean = fit.mean,
        B = plot.errors.boot.num,
        wild = plot.errors.boot.wild,
        progress.label = progress.label
      )
    }

    if (is.null(boot.out))
      stop(sprintf("unresolved bootstrap execution path for method '%s' in compute.bootstrap.errors.scbandwidth", plot.errors.boot.method), call. = FALSE)

    tdati <- if (slice.index <= ncol(xdat)) bws$xdati else bws$zdati
    ti <- if (slice.index <= ncol(xdat)) slice.index else slice.index - ncol(xdat)
    all.bp <- .np_plot_boot_factor_boxplots(
      boot.t = boot.out$t,
      tdati = tdati,
      ti = ti,
      B = plot.errors.boot.num
    )
    
    if (plot.errors.type == "pmzsd") {
      pmz.progress <- .np_plot_stage_progress_begin(
        total = 2L,
        label = "Computing bootstrap pmzsd errors"
      )
      on.exit(.np_plot_progress_end(pmz.progress), add = TRUE)
      boot.sd <- .np_plot_bootstrap_col_sds(boot.out$t)
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 1L, force = TRUE)
      boot.err[,1:2] = qnorm(plot.errors.alpha/2, lower.tail = FALSE) * boot.sd
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 2L, force = TRUE)
    }
    else if (plot.errors.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
      interval.summary <- .np_plot_bootstrap_interval_summary(
        boot.t = boot.out$t,
        t0 = boot.out$t0,
        alpha = plot.errors.alpha,
        band.type = plot.errors.type,
        progress.label = interval.label
      )
      boot.err[,1:2] <- interval.summary$err
      boot.all.err <- interval.summary$all.err
    }
    if (plot.errors.center == "bias-corrected")
      boot.err[,3] <- 2*boot.out$t0-colMeans(boot.out$t)
    list(boot.err = boot.err, bxp = all.bp, boot.all.err = boot.all.err)
  }

compute.bootstrap.errors.plbandwidth =
  function(xdat, ydat, zdat,
           exdat, ezdat,
           gradients,
           slice.index,
           progress.target = NULL,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.wild = c("rademacher", "mammen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           ...,
           bws){
    if (is.null(progress.target)) {
      progress.target <- .np_plot_scoef_bootstrap_target_label(
        bws = bws,
        slice.index = slice.index
      )
    }
    prep.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Preparing plot bootstrap %s", plot.errors.boot.method),
      target_label = progress.target
    )
    progress.label <- .np_plot_bootstrap_stage_label(
      stage = "Plot bootstrap",
      target_label = progress.target
    )
    interval.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Constructing bootstrap %s bands", plot.errors.type),
      target_label = progress.target
    )
    activity <- .np_plot_activity_begin(
      prep.label
    )
    on.exit(.np_plot_activity_end(activity), add = TRUE)
    .np_plot_require_bws(bws = bws, where = "compute.bootstrap.errors.plbandwidth")
    boot.err = matrix(data = NA, nrow = dim(exdat)[1], ncol = 3)
    boot.all.err <- NULL

    is.wild.hat <- .np_plot_is_wild_method(plot.errors.boot.method)
    is.inid <- plot.errors.boot.method == "inid"
    is.block <- is.element(plot.errors.boot.method, c("fixed", "geom"))
    use.frozen.nonfixed <- identical(plot.errors.boot.nonfixed, "frozen") &&
      !identical(bws$type, "fixed")
    helper.mode <- if (isTRUE(use.frozen.nonfixed)) "frozen" else "exact"
    if (is.wild.hat) {
      plot.errors.boot.wild <- .np_plot_normalize_wild(plot.errors.boot.wild)

      fit.mean <- as.vector(npplreghat(
        bws = bws,
        txdat = xdat,
        tzdat = zdat,
        exdat = xdat,
        ezdat = zdat,
        y = ydat,
        output = "apply"
      ))
      H <- npplreghat(
        bws = bws,
        txdat = xdat,
        tzdat = zdat,
        exdat = exdat,
        ezdat = ezdat,
        output = "matrix"
      )

      boot.out <- .np_plot_boot_from_hat_wild(
        H = H,
        ydat = ydat,
        fit.mean = fit.mean,
        B = plot.errors.boot.num,
        wild = plot.errors.boot.wild,
        progress.label = progress.label
      )
    } else {
      boot.out <- NULL
      if (is.inid) {
        boot.out <- tryCatch(
          .np_inid_boot_from_plreg(
            txdat = xdat,
            ydat = ydat,
            tzdat = zdat,
            exdat = exdat,
            ezdat = ezdat,
            bws = bws,
            B = plot.errors.boot.num,
            progress.label = progress.label,
            mode = helper.mode
          ),
          error = function(e) {
            stop(sprintf("inid plreg helper failed in compute.bootstrap.errors.plbandwidth (%s)",
                         conditionMessage(e)),
                 call. = FALSE)
          }
        )
      } else if (is.block) {
        counts.drawer <- .np_block_counts_drawer(
          n = nrow(xdat),
          B = plot.errors.boot.num,
          blocklen = plot.errors.boot.blocklen,
          sim = plot.errors.boot.method
        )
        boot.out <- tryCatch(
          .np_inid_boot_from_plreg(
            txdat = xdat,
            ydat = ydat,
            tzdat = zdat,
            exdat = exdat,
            ezdat = ezdat,
            bws = bws,
            B = plot.errors.boot.num,
            counts.drawer = counts.drawer,
            progress.label = progress.label,
            mode = helper.mode
          ),
          error = function(e) {
            stop(sprintf("%s plreg helper failed in compute.bootstrap.errors.plbandwidth (%s)",
                         plot.errors.boot.method,
                         conditionMessage(e)),
                 call. = FALSE)
          }
        )
      }

      if (is.null(boot.out))
        stop(sprintf("unresolved bootstrap execution path for method '%s' in compute.bootstrap.errors.plbandwidth", plot.errors.boot.method), call. = FALSE)
    }

    if (slice.index <= bws$xndim){
      tdati <- bws$xdati
      ti <- slice.index
    } else {
      tdati <- bws$zdati
      ti <- slice.index - bws$xndim
    }
    all.bp <- .np_plot_boot_factor_boxplots(
      boot.t = boot.out$t,
      tdati = tdati,
      ti = ti,
      B = plot.errors.boot.num
    )

    if (plot.errors.type == "pmzsd") {
      pmz.progress <- .np_plot_stage_progress_begin(
        total = 2L,
        label = "Computing bootstrap pmzsd errors"
      )
      on.exit(.np_plot_progress_end(pmz.progress), add = TRUE)
      boot.sd <- .np_plot_bootstrap_col_sds(boot.out$t)
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 1L, force = TRUE)
      boot.err[,1:2] = qnorm(plot.errors.alpha/2, lower.tail = FALSE) * boot.sd
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 2L, force = TRUE)
    }
    else if (plot.errors.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
      interval.summary <- .np_plot_bootstrap_interval_summary(
        boot.t = boot.out$t,
        t0 = boot.out$t0,
        alpha = plot.errors.alpha,
        band.type = plot.errors.type,
        progress.label = interval.label
      )
      boot.err[,1:2] <- interval.summary$err
      boot.all.err <- interval.summary$all.err
    }
    if (plot.errors.center == "bias-corrected")
      boot.err[,3] <- 2*boot.out$t0-colMeans(boot.out$t)
    list(boot.err = boot.err, bxp = all.bp, boot.all.err = boot.all.err)
  }

compute.bootstrap.errors.bandwidth =
  function(xdat, 
           exdat,
           cdf,
           slice.index,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           ...,
           bws){
    activity <- .np_plot_activity_begin(
      sprintf("Preparing plot bootstrap %s", plot.errors.boot.method)
    )
    on.exit(.np_plot_activity_end(activity), add = TRUE)
    .np_plot_require_bws(bws = bws, where = "compute.bootstrap.errors.bandwidth")
    .np_plot_reject_wild_unsupervised(plot.errors.boot.method, "unconditional density/distribution estimators")
    boot.err = matrix(data = NA, nrow = dim(exdat)[1], ncol = 3)
    boot.all.err <- NULL

    is.inid = plot.errors.boot.method=="inid"
    is.block <- is.element(plot.errors.boot.method, c("fixed", "geom"))
    use.frozen.nonfixed <- identical(plot.errors.boot.nonfixed, "frozen") &&
      !identical(bws$type, "fixed")
    fast.inid <- isTRUE(is.inid)
    fast.block <- isTRUE(is.block)

    if (is.inid && !isTRUE(fast.inid))
      stop("inid unconditional helper unavailable for this configuration; no alternate fallback is permitted", call. = FALSE)
    if (is.block && !isTRUE(fast.block))
      stop(sprintf("%s unconditional helper unavailable for this configuration; no alternate fallback is permitted", plot.errors.boot.method), call. = FALSE)

    boot.out <- NULL
    if (fast.inid || fast.block) {
      op <- if (cdf) "integral" else "normal"
      counts.drawer <- if (fast.block) {
        .np_block_counts_drawer(
          n = nrow(xdat),
          B = plot.errors.boot.num,
          blocklen = plot.errors.boot.blocklen,
          sim = plot.errors.boot.method
        )
      } else {
        NULL
      }
      boot.out <- tryCatch(
        if (use.frozen.nonfixed) {
          .np_inid_boot_from_hat_unconditional_frozen(
            xdat = xdat,
            exdat = exdat,
            bws = bws,
            B = plot.errors.boot.num,
            operator = op,
            counts.drawer = counts.drawer
          )
        } else {
          .np_inid_boot_from_ksum_unconditional(
            xdat = xdat,
            exdat = exdat,
            bws = bws,
            B = plot.errors.boot.num,
            operator = op,
            counts.drawer = counts.drawer
          )
        },
        error = function(e) {
          stop(sprintf("%s unconditional bootstrap helper failed in compute.bootstrap.errors.bandwidth (%s)",
                       if (fast.block) plot.errors.boot.method else "inid",
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }

    if (is.null(boot.out))
      stop("no canonical helper path available for this unconditional bootstrap configuration", call. = FALSE)

    all.bp <- .np_plot_boot_factor_boxplots(
      boot.t = boot.out$t,
      tdati = bws$xdati,
      ti = slice.index,
      B = plot.errors.boot.num
    )

    if (plot.errors.type == "pmzsd") {
      pmz.progress <- .np_plot_stage_progress_begin(
        total = 2L,
        label = "Computing bootstrap pmzsd errors"
      )
      on.exit(.np_plot_progress_end(pmz.progress), add = TRUE)
      boot.sd <- .np_plot_bootstrap_col_sds(boot.out$t)
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 1L, force = TRUE)
      boot.err[,1:2] = qnorm(plot.errors.alpha/2, lower.tail = FALSE) * boot.sd
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 2L, force = TRUE)
    }
    else if (plot.errors.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
      interval.summary <- .np_plot_bootstrap_interval_summary(
        boot.t = boot.out$t,
        t0 = boot.out$t0,
        alpha = plot.errors.alpha,
        band.type = plot.errors.type
      )
      boot.err[,1:2] <- interval.summary$err
      boot.all.err <- interval.summary$all.err
    }
    if (plot.errors.center == "bias-corrected")
      boot.err[,3] <- 2*boot.out$t0-colMeans(boot.out$t)
    list(boot.err = boot.err, bxp = all.bp, boot.all.err = boot.all.err)
  }

compute.bootstrap.errors.dbandwidth =
  function(xdat, 
           exdat,
           slice.index,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           ...,
           bws){
    compute.bootstrap.errors.bandwidth(
      xdat = xdat,
      exdat = exdat,
      cdf = TRUE,
      slice.index = slice.index,
      plot.errors.boot.method = plot.errors.boot.method,
      plot.errors.boot.nonfixed = plot.errors.boot.nonfixed,
      plot.errors.boot.blocklen = plot.errors.boot.blocklen,
      plot.errors.boot.num = plot.errors.boot.num,
      plot.errors.center = plot.errors.center,
      plot.errors.type = plot.errors.type,
      plot.errors.alpha = plot.errors.alpha,
      ...,
      bws = bws
    )
  }

compute.bootstrap.errors.conbandwidth =
  function(xdat, ydat,
           exdat, eydat,
           cdf,
           quantreg,
           tau,
           gradients,
           gradient.index,
           slice.index,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           progress.target = NULL,
           proper = FALSE,
           proper.method = NULL,
           proper.control = list(),
           ...,
           bws){
    prep.label <- .np_plot_bootstrap_stage_label(
      stage = "Preparing plot bootstrap",
      method_label = plot.errors.boot.method,
      target_label = progress.target
    )
    progress.label <- .np_plot_bootstrap_stage_label(
      stage = "Plot bootstrap",
      target_label = progress.target
    )
    interval.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Constructing bootstrap %s bands", plot.errors.type),
      target_label = progress.target
    )

    activity <- .np_plot_activity_begin(prep.label)
    on.exit(.np_plot_activity_end(activity), add = TRUE)
    .np_plot_require_bws(bws = bws, where = "compute.bootstrap.errors.conbandwidth")
    exdat = toFrame(exdat)
    boot.err = matrix(data = NA, nrow = dim(exdat)[1], ncol = 3)
    boot.all.err <- NULL

    tboo =
      if(quantreg) "quant"
      else if (cdf) "dist"
      else "dens"

    if (!identical(tboo, "quant")) {
      .np_plot_reject_wild_unsupervised(plot.errors.boot.method, "conditional density/distribution estimators")
    }

    is.inid = plot.errors.boot.method=="inid"
    is.block <- is.element(plot.errors.boot.method, c("fixed", "geom"))
    use.frozen.nonfixed <- identical(plot.errors.boot.nonfixed, "frozen") &&
      !identical(bws$type, "fixed")
    frozen.nonfixed.ok <- isTRUE(use.frozen.nonfixed) &&
      isTRUE(!quantreg) &&
      isTRUE(!gradients)
    fast.inid <- isTRUE(is.inid) &&
      isTRUE(!quantreg) &&
      isTRUE(!gradients) &&
      isTRUE(frozen.nonfixed.ok || .np_con_inid_ksum_eligible(bws))
    fast.block <- isTRUE(is.block) &&
      isTRUE(!quantreg) &&
      isTRUE(!gradients) &&
      isTRUE(frozen.nonfixed.ok || .np_con_inid_ksum_eligible(bws))
    gradient.local.ok <- isTRUE(!quantreg) && isTRUE(gradients)
    quantile.gradient.local.ok <- isTRUE(quantreg) && isTRUE(gradients)

    if (is.inid && !isTRUE(fast.inid) && !isTRUE(gradient.local.ok) && !isTRUE(quantile.gradient.local.ok))
      stop("inid conditional helper unavailable for this configuration; no alternate fallback is permitted", call. = FALSE)
    if (is.block && !isTRUE(fast.block) && !isTRUE(gradient.local.ok) && !isTRUE(quantile.gradient.local.ok))
      stop(sprintf("%s conditional helper unavailable for this configuration; no alternate fallback is permitted", plot.errors.boot.method), call. = FALSE)

    boot.out <- NULL
    if (fast.inid || fast.block) {
      counts.drawer <- if (fast.block) {
        .np_block_counts_drawer(
          n = nrow(xdat),
          B = plot.errors.boot.num,
          blocklen = plot.errors.boot.blocklen,
          sim = plot.errors.boot.method
        )
      } else {
        NULL
      }
      boot.out <- tryCatch(
        if (use.frozen.nonfixed) {
          .np_inid_boot_from_hat_conditional_frozen(
            xdat = xdat,
            ydat = ydat,
            exdat = exdat,
            eydat = eydat,
            bws = bws,
            B = plot.errors.boot.num,
            cdf = cdf,
            counts.drawer = counts.drawer,
            progress.label = progress.label
          )
        } else {
          .np_inid_boot_from_ksum_conditional(
            xdat = xdat,
            ydat = ydat,
            exdat = exdat,
            eydat = eydat,
            bws = bws,
            B = plot.errors.boot.num,
            cdf = cdf,
            counts.drawer = counts.drawer,
            progress.label = progress.label
          )
        },
        error = function(e) {
          stop(sprintf("%s conditional bootstrap helper failed in compute.bootstrap.errors.conbandwidth (%s)",
                       if (fast.block) plot.errors.boot.method else "inid",
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }

    if (is.null(boot.out) && isTRUE(gradient.local.ok) && (isTRUE(is.inid) || isTRUE(is.block))) {
      counts.drawer <- if (is.block) {
        .np_block_counts_drawer(
          n = nrow(xdat),
          B = plot.errors.boot.num,
          blocklen = plot.errors.boot.blocklen,
          sim = plot.errors.boot.method
        )
      } else {
        NULL
      }
      boot.out <- tryCatch(
        .np_inid_boot_from_conditional_gradient_local(
          xdat = xdat,
          ydat = ydat,
          exdat = exdat,
          eydat = eydat,
          bws = bws,
          B = plot.errors.boot.num,
          cdf = cdf,
          gradient.index = gradient.index,
          counts.drawer = counts.drawer,
          progress.label = progress.label
        ),
        error = function(e) {
          stop(sprintf("%s conditional gradient bootstrap helper failed in compute.bootstrap.errors.conbandwidth (%s)",
                       if (is.block) plot.errors.boot.method else "inid",
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }

    if (is.null(boot.out) && isTRUE(quantile.gradient.local.ok) && (isTRUE(is.inid) || isTRUE(is.block))) {
      counts.drawer <- if (is.block) {
        .np_block_counts_drawer(
          n = nrow(xdat),
          B = plot.errors.boot.num,
          blocklen = plot.errors.boot.blocklen,
          sim = plot.errors.boot.method
        )
      } else {
        NULL
      }
      boot.out <- tryCatch(
        .np_inid_boot_from_quantile_gradient_local(
          xdat = xdat,
          ydat = ydat[[1L]],
          exdat = exdat,
          bws = bws,
          B = plot.errors.boot.num,
          tau = tau,
          gradient.index = gradient.index,
          counts.drawer = counts.drawer,
          progress.label = progress.label
        ),
        error = function(e) {
          stop(sprintf("%s quantile gradient bootstrap helper failed in compute.bootstrap.errors.conbandwidth (%s)",
                       if (is.block) plot.errors.boot.method else "inid",
                       conditionMessage(e)),
               call. = FALSE)
        }
      )
    }

    if (is.null(boot.out))
      stop("no canonical helper path available for this conditional bootstrap configuration", call. = FALSE)

    if (!identical(tboo, "quant") && isTRUE(proper)) {
      proper.progress.label <- .np_plot_bootstrap_stage_label(
        stage = "Projecting proper bootstrap surfaces",
        target_label = progress.target
      )
      proper.template <- list(
        xeval = exdat,
        yeval = eydat,
        gradients = gradients,
        trainiseval = FALSE,
        yndim = bws$yndim,
        yncon = bws$yncon,
        ynord = bws$ynord,
        ynuno = bws$ynuno
      )

      if (isTRUE(cdf)) {
        proper.plan <- .np_condist_prepare_proper_plan(
          object = proper.template,
          proper.control = proper.control
        )
        if (!isTRUE(proper.plan$supported)) {
          stop(.np_condist_proper_reason_message(
            reason = proper.plan$reason,
            where = "plot()"
          ), call. = FALSE)
        }
        boot.out$t0 <- .np_condist_project_values_with_plan(boot.out$t0, proper.plan)
        boot.out$t <- .np_condist_project_values_with_plan(
          boot.out$t,
          proper.plan,
          progress.label = proper.progress.label
        )
      } else {
        proper.plan <- .np_condens_prepare_proper_plan(
          object = proper.template,
          proper.control = proper.control
        )
        if (!isTRUE(proper.plan$supported)) {
          stop(.np_condens_proper_reason_message(
            reason = proper.plan$reason,
            where = "plot()"
          ), call. = FALSE)
        }
        boot.out$t0 <- .np_condens_project_values_with_plan(boot.out$t0, proper.plan)
        boot.out$t <- .np_condens_project_values_with_plan(
          boot.out$t,
          proper.plan,
          progress.label = proper.progress.label
        )
      }
    }

    if (slice.index <= bws$xndim){
      tdati <- bws$xdati
      ti <- slice.index
    } else {
      tdati <- bws$ydati
      ti <- slice.index - bws$xndim
    }
    all.bp <- .np_plot_boot_factor_boxplots(
      boot.t = boot.out$t,
      tdati = tdati,
      ti = ti,
      B = plot.errors.boot.num
    )

    if (plot.errors.type == "pmzsd") {
      pmz.progress <- .np_plot_stage_progress_begin(
        total = 2L,
        label = "Computing bootstrap pmzsd errors"
      )
      on.exit(.np_plot_progress_end(pmz.progress), add = TRUE)
      boot.sd <- .np_plot_bootstrap_col_sds(boot.out$t)
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 1L, force = TRUE)
      boot.err[,1:2] = qnorm(plot.errors.alpha/2, lower.tail = FALSE) * boot.sd
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 2L, force = TRUE)
    }
    else if (plot.errors.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
      interval.summary <- .np_plot_bootstrap_interval_summary(
        boot.t = boot.out$t,
        t0 = boot.out$t0,
        alpha = plot.errors.alpha,
        band.type = plot.errors.type,
        progress.label = interval.label
      )
      boot.err[,1:2] <- interval.summary$err
      boot.all.err <- interval.summary$all.err
    }
    if (plot.errors.center == "bias-corrected")
      boot.err[,3] <- 2*boot.out$t0-colMeans(boot.out$t)
    list(boot.err = boot.err, bxp = all.bp, boot.all.err = boot.all.err)
  }

compute.bootstrap.errors.condbandwidth =
  function(xdat, ydat,
           exdat, eydat,
           cdf,
           quantreg,
           tau,
           gradients,
           gradient.index,
           slice.index,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           ...,
           bws){
    compute.bootstrap.errors.conbandwidth(
      xdat = xdat,
      ydat = ydat,
      exdat = exdat,
      eydat = eydat,
      cdf = cdf,
      quantreg = quantreg,
      tau = tau,
      gradients = gradients,
      gradient.index = gradient.index,
      slice.index = slice.index,
      plot.errors.boot.method = plot.errors.boot.method,
      plot.errors.boot.nonfixed = plot.errors.boot.nonfixed,
      plot.errors.boot.blocklen = plot.errors.boot.blocklen,
      plot.errors.boot.num = plot.errors.boot.num,
      plot.errors.center = plot.errors.center,
      plot.errors.type = plot.errors.type,
      plot.errors.alpha = plot.errors.alpha,
      ...,
      bws = bws
    )
  }

compute.bootstrap.errors.sibandwidth =
  function(xdat, ydat,
           gradients,
           plot.errors.boot.method,
           plot.errors.boot.nonfixed = c("exact", "frozen"),
           plot.errors.boot.wild = c("rademacher", "mammen"),
           plot.errors.boot.blocklen,
           plot.errors.boot.num,
           plot.errors.center,
           plot.errors.type,
           plot.errors.alpha,
           ...,
           bws){
    progress.target <- .np_plot_singleindex_bootstrap_target_label(gradients = gradients)
    prep.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Preparing plot bootstrap %s", plot.errors.boot.method),
      target_label = progress.target
    )
    progress.label <- .np_plot_bootstrap_stage_label(
      stage = "Plot bootstrap",
      target_label = progress.target
    )
    interval.label <- .np_plot_bootstrap_stage_label(
      stage = sprintf("Constructing bootstrap %s bands", plot.errors.type),
      target_label = progress.target
    )
    activity <- .np_plot_activity_begin(
      prep.label
    )
    on.exit(.np_plot_activity_end(activity), add = TRUE)
    .np_plot_require_bws(bws = bws, where = "compute.bootstrap.errors.sibandwidth")
    xdat <- toFrame(xdat)
    idx.train <- data.frame(index = as.vector(toMatrix(xdat) %*% bws$beta))
    dots <- list(...)
    idx.eval <- dots$idx.eval
    if (is.null(idx.eval))
      idx.eval <- idx.train
    idx.eval <- toFrame(idx.eval)

    boot.err = matrix(data = NA, nrow = nrow(idx.eval), ncol = 3)
    boot.all.err <- NULL

    is.wild.hat <- .np_plot_is_wild_method(plot.errors.boot.method)
    is.inid <- plot.errors.boot.method=="inid"
    is.block <- is.element(plot.errors.boot.method, c("fixed", "geom"))
    use.frozen.nonfixed <- identical(plot.errors.boot.nonfixed, "frozen") &&
      !identical(bws$type, "fixed")

    if (is.wild.hat) {
      plot.errors.boot.wild <- .np_plot_normalize_wild(plot.errors.boot.wild)

      fit.mean <- as.vector(.np_plot_singleindex_hat_apply_index(
        bws = bws,
        idx.train = idx.train,
        idx.eval = idx.train,
        y = ydat
      ))
      H <- .np_plot_singleindex_hat_matrix_index(
        bws = bws,
        idx.train = idx.train,
        idx.eval = idx.eval,
        s = if (gradients) 1L else 0L
      )

      boot.out <- .np_plot_boot_from_hat_wild(
        H = H,
        ydat = ydat,
        fit.mean = fit.mean,
        B = plot.errors.boot.num,
        wild = plot.errors.boot.wild,
        progress.label = progress.label
      )
    } else if (is.inid) {
      inid.helper.ok <- isTRUE(use.frozen.nonfixed) || (!isTRUE(gradients)) || identical(bws$type, "fixed")
      if (!isTRUE(inid.helper.ok)) {
        stop("inid bootstrap requires helper mode with gradients=FALSE in compute.bootstrap.errors.sibandwidth", call. = FALSE)
      } else {
        boot.out <- tryCatch({
          .np_inid_boot_from_index(
            xdat = xdat,
            ydat = ydat,
            bws = bws,
            B = plot.errors.boot.num,
            gradients = gradients,
            frozen = use.frozen.nonfixed,
            idx.eval = idx.eval,
            progress.label = progress.label
          )
        }, error = function(e) {
          stop(sprintf("inid single-index helper failed in compute.bootstrap.errors.sibandwidth (%s)",
                       conditionMessage(e)),
               call. = FALSE)
        })
      }
    } else if (is.block) {
      block.helper.ok <- isTRUE(use.frozen.nonfixed) || (!isTRUE(gradients)) || identical(bws$type, "fixed")
      if (!isTRUE(block.helper.ok)) {
        stop(sprintf("%s bootstrap requires helper mode with gradients=FALSE in compute.bootstrap.errors.sibandwidth", plot.errors.boot.method), call. = FALSE)
      } else {
        boot.out <- tryCatch({
          counts.drawer <- .np_block_counts_drawer(
            n = nrow(xdat),
            B = plot.errors.boot.num,
            blocklen = plot.errors.boot.blocklen,
            sim = plot.errors.boot.method
          )
          .np_inid_boot_from_index(
            xdat = xdat,
            ydat = ydat,
            bws = bws,
            B = plot.errors.boot.num,
            counts.drawer = counts.drawer,
            gradients = gradients,
            frozen = use.frozen.nonfixed,
            idx.eval = idx.eval,
            progress.label = progress.label
          )
        }, error = function(e) {
          stop(sprintf("%s single-index helper failed in compute.bootstrap.errors.sibandwidth (%s)",
                       plot.errors.boot.method,
                       conditionMessage(e)),
               call. = FALSE)
        })
      }
    }

    if (is.null(boot.out))
      stop(sprintf("unresolved bootstrap execution path for method '%s' in compute.bootstrap.errors.sibandwidth", plot.errors.boot.method), call. = FALSE)
    
    if (plot.errors.type == "pmzsd") {
      pmz.progress <- .np_plot_stage_progress_begin(
        total = 2L,
        label = "Computing bootstrap pmzsd errors"
      )
      on.exit(.np_plot_progress_end(pmz.progress), add = TRUE)
      boot.sd <- .np_plot_bootstrap_col_sds(boot.out$t)
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 1L, force = TRUE)
      boot.err[,1:2] = qnorm(plot.errors.alpha/2, lower.tail = FALSE) * boot.sd
      pmz.progress <- .np_plot_progress_tick(state = pmz.progress, done = 2L, force = TRUE)
    }
    else if (plot.errors.type %in% c("pointwise", "bonferroni", "simultaneous", "all")) {
      interval.summary <- .np_plot_bootstrap_interval_summary(
        boot.t = boot.out$t,
        t0 = boot.out$t0,
        alpha = plot.errors.alpha,
        band.type = plot.errors.type,
        progress.label = interval.label
      )
      boot.err[,1:2] <- interval.summary$err
      boot.all.err <- interval.summary$all.err
    }
    if (plot.errors.center == "bias-corrected")
      boot.err[,3] <- 2*boot.out$t0-colMeans(boot.out$t)
    list(boot.err = boot.err, bxp = list(), boot.all.err = boot.all.err)
  }


uocquantile <- function(x, prob) {
  if(anyNA(prob)) stop("'prob' contains missing values")
  if(any(prob < 0 | prob > 1, na.rm = TRUE)) stop("'prob' outside [0,1]")
  if(anyNA(x)) stop("missing values and NaN's not allowed")
  if (is.ordered(x)){
    x <- droplevels(x)
    tq = unclass(table(x))
    tq = tq / sum(tq)
    tq[length(tq)] <- 1.0
    bscape <- levels(x)
    tq <- cumsum(tq)
    j <- sapply(prob, function(p){ which(tq >= p)[1] })
    bscape[j]
  } else if (is.factor(x)) {
    ## just returns mode
    x <- droplevels(x)
    tq = unclass(table(x))
    j = which(tq == max(tq))[1]
    levels(x)[j]
  } else {
    quantile(x, probs = prob)
  }
}


trim.quantiles <- function(dat, trim){
  if (sign(trim) == sign(-1)){
    trim <- abs(trim)
    tq <- quantile(dat, probs = c(0.0, 0.0+trim, 1.0-trim,1.0))
    tq <- c(2.0*tq[1]-tq[2], 2.0*tq[4]-tq[3])
  }
  else {
    tq <- quantile(dat, probs = c(0.0+trim, 1.0-trim))
  }
  tq
}

Try the np package in your browser

Any scripts or data that you put into this service are public.

np documentation built on May 3, 2026, 1:07 a.m.