Skip to content

Structure API

The structure API gives vine-specific algorithms a small, stable handle for the part of a vine that is not a pair-copula family or parameter.

AbstractVineStructure

AbstractVineStructure{p} is the abstract supertype for p-dimensional vine structures. Concrete public structures are:

  • CVineStructure{p,q};

  • DVineStructure{p,q};

  • RVineStructure{p,q}.

Here p is the dimension and q is the active truncation depth.

Do not store the same invariant twice

Structure truncation is encoded by q. Do not add a separate mutable or runtime truncation field to structure objects. A duplicated q/trunc representation can create inconsistent states and ambiguous traversal behavior.

CVineStructure and DVineStructure

CVineStructure and DVineStructure store only an order:

julia
CVineStructure{p,q}(order::NTuple{p,Int})
DVineStructure{p,q}(order::NTuple{p,Int})

Public constructors accept vectors or tuples and normalize to NTuple{p,Int}:

julia
st = CVineStructure((1, 2, 3, 4); trunc=2)
CVineStructure(order(st); trunc=truncation(st))

RVineStructure

RVineStructure stores order, structure array, and an optional matrix exchange representation:

julia
RVineStructure{p,q}(
    order::NTuple{p,Int},
    struct_array::NTuple{q,Vector{Int}},
    matrix::Union{Nothing,Matrix{Int}},
)

For R-vines, the invariant is especially direct:

Public operations

The public structural operations are:

julia
structure(vine)
order(vine_or_structure)
edges(vine)
struct_array(rvine_or_structure)
truncation(vine_or_structure)
truncate(vine_or_structure, level)
rvine_matrix(vine)

These methods are defined only for supported concrete types. There is no catch-all fallback for AbstractVineCopula or AbstractVineStructure.

Capability checks

Because unsupported abstract subtypes do not receive generic throwing fallbacks, applicable(structure, x) and applicable(truncation, x) are meaningful capability checks.

Truncation invariants

truncate(vine, level) and truncate(structure, level) return new objects. They do not mutate the input.

Truncating from level 4 to level 2 is valid. Truncating that result back to level 3 is not valid because the missing pair-copulas are no longer present.

The current public level range is 1:p-1. Level-zero truncation is mathematically meaningful as multivariate independence, but it requires a deliberate engine/API pass and is therefore tracked as future work.

Developer guidance

Add structure methods when they simplify a real algorithm: serialization, plotting, fitting, diagnostics, conditional simulation, or truncation. Avoid creating parallel structure abstractions that duplicate the public vine model objects without a concrete use.