Skip to contents

Proposes one lower positive heat time after an external search controller has classified the current lower endpoint. The helper enforces a geometric expansion step, an identity-departure floor, a maximum number of expansion rounds, and the truncated-basis resolution certificate. It does not decide whether an endpoint is competitive; fold-level or cohort-level search logic remains the caller's responsibility.

Usage

metric.graph.heat.extend.lower(
  basis,
  eta.grid,
  endpoint.status = c("active", "inactive", "unresolved"),
  expansion.factor = 3,
  max.expansions = 3L,
  expansions.completed = 0L,
  identity.departure = 0.01,
  truncation.tol = 1e-04,
  unresolved.action = c("error", "mark")
)

Arguments

basis

A "metric.graph.lowpass.basis" object.

eta.grid

Current finite positive heat-time grid. The exact identity time eta = 0 is intentionally excluded from competitive search.

endpoint.status

External lower-endpoint classification: "active" proposes one extension, while "inactive" and "unresolved" return the grid unchanged.

expansion.factor

Finite numeric factor greater than one. An active proposal is min(eta.grid) / expansion.factor before applying the identity floor.

max.expansions

Nonnegative integer maximum number of lower-extension rounds.

expansions.completed

Nonnegative integer number of extension rounds already admitted under the same search contract.

identity.departure

Positive number smaller than one. The proposed time cannot be smaller than -log(1 - identity.departure) / lambda.max, where lambda.max is the largest retained eigenvalue. For a complete basis this is the exact largest graph-Laplacian eigenvalue.

truncation.tol

Positive tolerance smaller than one for the conservative omitted-mode attenuation bound.

unresolved.action

Action when an active proposal is not certified by a truncated basis: "error" or "mark".

Value

A list of class "metric.graph.heat.lower.extension" with the augmented or unchanged grid and proposal telemetry. A proposal is added only when admitted is TRUE.

Examples

adj <- list(2L, c(1L, 3L), c(2L, 4L), 3L)
lengths <- list(1, c(1, 1), c(1, 1), 1)
basis <- metric.graph.lowpass.basis(adj, lengths, n.eigenpairs = 4L,
                                    eigen.solver = "dense")
eta <- metric.graph.heat.eta.grid(basis, n.initial = 6L)
metric.graph.heat.extend.lower(basis, eta, endpoint.status = "active")
#> $eta.grid
#> [1]  0.09763107  0.29289322  0.64964295  1.44092090  3.19599103  7.08877124
#> [7] 15.72303466
#> 
#> $previous.eta.min
#> [1] 0.2928932
#> 
#> $proposed.eta.raw
#> [1] 0.09763107
#> 
#> $proposed.eta
#> [1] 0.09763107
#> 
#> $identity.floor
#> [1] 0.002943675
#> 
#> $identity.departure
#> [1] 0.01
#> 
#> $lambda.max
#> [1] 3.414214
#> 
#> $lambda.max.type
#> [1] "complete_spectrum"
#> 
#> $omitted.attenuation.bound
#> [1] 0.7165313
#> 
#> $truncation.tol
#> [1] 1e-04
#> 
#> $basis.complete
#> [1] TRUE
#> 
#> $endpoint.status
#> [1] "active"
#> 
#> $expansion.factor
#> [1] 3
#> 
#> $max.expansions
#> [1] 3
#> 
#> $expansions.completed
#> [1] 0
#> 
#> $expansion.round
#> [1] 1
#> 
#> $admitted
#> [1] TRUE
#> 
#> $status
#> [1] "admitted"
#> 
#> attr(,"class")
#> [1] "metric.graph.heat.lower.extension" "list"