Skip to content

Layers

Multilayer helpers from annnet.core._Layers.

Use G.layers and the AnnNet layer methods for layer workflows. Direct imports from underscore modules follow the internal API policy.

annnet.core._Layers.LayerAccessor

Namespace for multilayer operations on an :class:~annnet.core.graph.AnnNet graph.

Returned by G.layers. All multilayer configuration, presence queries, layer-set algebra, and supra-matrix constructions live here.

Functions

set_aspects
set_aspects(aspects, elem_layers=None)

Define multi-aspect structure.

Parameters:

Name Type Description Default
aspects list[str]

Aspect identifiers (e.g., ["time", "relation"]).

required
elem_layers dict[str, list[str]]

Elementary labels per aspect (e.g., {"time": ["t1","t2"]}).

None

Returns:

Type Description
None

Raises:

Type Description
ValueError

If aspects is empty.

Examples:

G.set_aspects(['time', 'relation'], {'time': ['t1', 't2'], 'relation': ['F', 'A']})
set_elementary_layers
set_elementary_layers(layers_by_aspect)

Declare concrete elementary layer values for existing aspects.

flatten_layers
flatten_layers()

Remove multilayer structure in-place and project to a flat graph.

Returns:

Type Description
AnnNet

The mutated graph itself.

Notes

This projects vertex identities from (vertex_id, layer_tuple) to bare vertex_id strings and drops multilayer-only metadata such as aspects, layer registries, supra-node attributes, and multilayer edge roles.

add_elementary_layer
add_elementary_layer(aspect, label)

Register a new elementary layer label under an existing aspect.

Parameters:

Name Type Description Default
aspect str

Existing aspect name.

required
label str

New elementary layer label.

required

Returns:

Type Description
None
has_presence
has_presence(u, layer_tuple)

Check whether (u, aa) is present in _entities.

Parameters:

Name Type Description Default
u str

Vertex identifier.

required
layer_tuple tuple[str, ...]

Aspect tuple layer.

required

Returns:

Type Description
bool
iter_layers
iter_layers()

Iterate over all aspect-tuples (Cartesian product).

Yields:

Type Description
tuple[str, ...]

Layer tuples in configured order.

iter_vertex_layers
iter_vertex_layers(u)

Iterate layer tuples where (u, aa) is in V_M.

Parameters:

Name Type Description Default
u str

Vertex identifier.

required

Yields:

Type Description
tuple[str, ...]

Layer tuples for u.

ensure_vertex_layer_index
ensure_vertex_layer_index(restrict_layers=None)

Return the number of indexed vertex–layer pairs.

Parameters:

Name Type Description Default
restrict_layers list[tuple[str, ...]] | None

If provided, count only these layers.

None

Returns:

Type Description
int

Number of indexed vertex–layer pairs.

Notes

Kept for backward compatibility. Use _build_supra_index() internally.

nl_to_row
nl_to_row(u, layer_tuple)

Map (u, aa) to row index.

Parameters:

Name Type Description Default
u str

Vertex identifier.

required
layer_tuple tuple[str, ...]

Aspect tuple layer.

required

Returns:

Type Description
int

Raises:

Type Description
KeyError

If the vertex–layer pair is not indexed.

row_to_nl
row_to_nl(row)

Map row index to (u, aa).

Parameters:

Name Type Description Default
row int

Row index.

required

Returns:

Type Description
tuple[str, tuple[str, ...]]

Raises:

Type Description
KeyError

If the row is not indexed.

layer_id_to_tuple
layer_id_to_tuple(layer_id)

Map legacy string layer id to aspect tuple.

Parameters:

Name Type Description Default
layer_id str

Layer identifier (single-aspect only).

required

Returns:

Type Description
tuple[str, ...]

Raises:

Type Description
ValueError

If not in single-aspect mode.

layer_tuple_to_id
layer_tuple_to_id(aa)

Canonical string id for a layer tuple.

Parameters:

Name Type Description Default
aa tuple[str, ...]

Aspect tuple layer.

required

Returns:

Type Description
str

Canonical id (single label for 1 aspect, or "×"-joined).

set_elementary_layer_attrs
set_elementary_layer_attrs(aspect, label, **attrs)

Attach attributes to an elementary Kivela layer.

Parameters:

Name Type Description Default
aspect str

Aspect identifier.

required
label str

Elementary layer label.

required
**attrs

Key-value metadata to store.

{}

Returns:

Type Description
None
get_elementary_layer_attrs
get_elementary_layer_attrs(aspect, label)

Get attributes for an elementary Kivela layer.

Parameters:

Name Type Description Default
aspect str

Aspect identifier.

required
label str

Elementary layer label.

required

Returns:

Type Description
dict

Attributes dict; empty if not set.

set_aspect_attrs
set_aspect_attrs(aspect, **attrs)

Attach metadata to a Kivela aspect.

Parameters:

Name Type Description Default
aspect str

Aspect identifier.

required
**attrs

Key-value metadata to store.

{}

Returns:

Type Description
None
get_aspect_attrs
get_aspect_attrs(aspect)

Return a shallow copy of metadata for a Kivela aspect.

Parameters:

Name Type Description Default
aspect str

Aspect identifier.

required

Returns:

Type Description
dict
set_layer_attrs
set_layer_attrs(layer_tuple, **attrs)

Attach metadata to a Kivela layer.

Parameters:

Name Type Description Default
layer_tuple tuple[str, ...]

Aspect tuple layer.

required
**attrs

Key-value metadata to store.

{}

Returns:

Type Description
None
get_layer_attrs
get_layer_attrs(layer_tuple)

Get metadata dict for a Kivela layer.

Parameters:

Name Type Description Default
layer_tuple tuple[str, ...]

Aspect tuple layer.

required

Returns:

Type Description
dict

Shallow copy; empty if not set.

set_vertex_layer_attrs
set_vertex_layer_attrs(u, layer_tuple, **attrs)

Attach metadata to a vertex–layer pair.

Parameters:

Name Type Description Default
u str

Vertex identifier.

required
layer_tuple tuple[str, ...]

Aspect tuple layer.

required
**attrs

Key-value metadata to store.

{}

Returns:

Type Description
None

Raises:

Type Description
KeyError

If (u, layer_tuple) is not present in V_M.

get_vertex_layer_attrs
get_vertex_layer_attrs(u, layer_tuple)

Get metadata dict for a vertex–layer pair.

Parameters:

Name Type Description Default
u str

Vertex identifier.

required
layer_tuple tuple[str, ...]

Aspect tuple layer.

required

Returns:

Type Description
dict

Shallow copy; empty if not set.

layer_vertex_set
layer_vertex_set(layer_tuple)

Vertices present in a Kivela layer.

Parameters:

Name Type Description Default
layer_tuple Iterable[str]

Aspect tuple layer.

required

Returns:

Type Description
set[str]
layer_edge_set
layer_edge_set(
    layer_tuple,
    *,
    include_inter=False,
    include_coupling=False
)

Edges associated with a Kivela layer.

Parameters:

Name Type Description Default
layer_tuple Iterable[str]

Aspect tuple layer.

required
include_inter bool

Include inter-layer edges touching layer_tuple.

False
include_coupling bool

Include coupling edges touching layer_tuple.

False

Returns:

Type Description
set[str]
layer_union
layer_union(
    layer_tuples,
    *,
    include_inter=False,
    include_coupling=False
)

Union of several Kivela layers.

Parameters:

Name Type Description Default
layer_tuples Iterable[Iterable[str]]

Layer tuples to union.

required
include_inter bool

Include inter-layer edges touching any layer in the union.

False
include_coupling bool

Include coupling edges touching any layer in the union.

False

Returns:

Type Description
dict

{"vertices": set[str], "edges": set[str]}.

layer_intersection
layer_intersection(
    layer_tuples,
    *,
    include_inter=False,
    include_coupling=False
)

Intersection of several Kivela layers.

Parameters:

Name Type Description Default
layer_tuples Iterable[Iterable[str]]

Layer tuples to intersect.

required
include_inter bool

Include inter-layer edges touching any layer in the intersection.

False
include_coupling bool

Include coupling edges touching any layer in the intersection.

False

Returns:

Type Description
dict

{"vertices": set[str], "edges": set[str]}.

layer_difference
layer_difference(
    layer_a,
    layer_b,
    *,
    include_inter=False,
    include_coupling=False
)

Set difference: elements in layer_a but not in layer_b.

Parameters:

Name Type Description Default
layer_a Iterable[str]

Minuend layer tuple.

required
layer_b Iterable[str]

Subtrahend layer tuple.

required
include_inter bool

Include inter-layer edges touching layer_a.

False
include_coupling bool

Include coupling edges touching layer_a.

False

Returns:

Type Description
dict

{"vertices": set[str], "edges": set[str]}.

create_slice_from_layer
create_slice_from_layer(
    slice_id,
    layer_tuple,
    *,
    include_inter=False,
    include_coupling=False,
    **attributes
)

Create a slice induced by a single Kivela layer.

Parameters:

Name Type Description Default
slice_id str

Slice identifier.

required
layer_tuple Iterable[str]

Layer tuple.

required
include_inter bool

Include inter-layer edges touching layer_tuple.

False
include_coupling bool

Include coupling edges touching layer_tuple.

False
**attributes

Slice attributes to store.

{}

Returns:

Type Description
str

The created slice id.

Examples:

G.create_slice_from_layer('t1_F', ('t1', 'F'))
create_slice_from_layer_union
create_slice_from_layer_union(
    slice_id,
    layer_tuples,
    *,
    include_inter=False,
    include_coupling=False,
    **attributes
)

Create a slice as the union of several layers.

Parameters:

Name Type Description Default
slice_id str

Slice identifier.

required
layer_tuples Iterable[Iterable[str]]

Layer tuples to union.

required
include_inter bool

Include inter-layer edges touching any layer in the union.

False
include_coupling bool

Include coupling edges touching any layer in the union.

False
**attributes

Slice attributes to store.

{}

Returns:

Type Description
str

The created slice id.

create_slice_from_layer_intersection
create_slice_from_layer_intersection(
    slice_id,
    layer_tuples,
    *,
    include_inter=False,
    include_coupling=False,
    **attributes
)

Create a slice as the intersection of several layers.

Parameters:

Name Type Description Default
slice_id str

Slice identifier.

required
layer_tuples Iterable[Iterable[str]]

Layer tuples to intersect.

required
include_inter bool

Include inter-layer edges touching any layer in the intersection.

False
include_coupling bool

Include coupling edges touching any layer in the intersection.

False
**attributes

Slice attributes to store.

{}

Returns:

Type Description
str

The created slice id.

create_slice_from_layer_difference
create_slice_from_layer_difference(
    slice_id,
    layer_a,
    layer_b,
    *,
    include_inter=False,
    include_coupling=False,
    **attributes
)

Create a slice as the difference of two layers.

Parameters:

Name Type Description Default
slice_id str

Slice identifier.

required
layer_a Iterable[str]

Minuend layer tuple.

required
layer_b Iterable[str]

Subtrahend layer tuple.

required
include_inter bool

Include inter-layer edges touching layer_a.

False
include_coupling bool

Include coupling edges touching layer_a.

False
**attributes

Slice attributes to store.

{}

Returns:

Type Description
str

The created slice id.

subgraph_from_layer_tuple
subgraph_from_layer_tuple(
    layer_tuple,
    *,
    include_inter=False,
    include_coupling=False
)

Concrete subgraph induced by a single Kivela layer.

Parameters:

Name Type Description Default
layer_tuple Iterable[str]

Layer tuple.

required
include_inter bool

Include inter-layer edges touching layer_tuple.

False
include_coupling bool

Include coupling edges touching layer_tuple.

False

Returns:

Type Description
AnnNet
subgraph_from_layer_union
subgraph_from_layer_union(
    layer_tuples,
    *,
    include_inter=False,
    include_coupling=False
)

Concrete subgraph induced by the union of several layers.

Parameters:

Name Type Description Default
layer_tuples Iterable[Iterable[str]]

Layer tuples to union.

required
include_inter bool

Include inter-layer edges touching any layer in the union.

False
include_coupling bool

Include coupling edges touching any layer in the union.

False

Returns:

Type Description
AnnNet
subgraph_from_layer_intersection
subgraph_from_layer_intersection(
    layer_tuples,
    *,
    include_inter=False,
    include_coupling=False
)

Concrete subgraph induced by the intersection of several layers.

Parameters:

Name Type Description Default
layer_tuples Iterable[Iterable[str]]

Layer tuples to intersect.

required
include_inter bool

Include inter-layer edges touching any layer in the intersection.

False
include_coupling bool

Include coupling edges touching any layer in the intersection.

False

Returns:

Type Description
AnnNet
subgraph_from_layer_difference
subgraph_from_layer_difference(
    layer_a,
    layer_b,
    *,
    include_inter=False,
    include_coupling=False
)

Concrete subgraph induced by a set-difference of two layers.

Parameters:

Name Type Description Default
layer_a Iterable[str]

Minuend layer tuple.

required
layer_b Iterable[str]

Subtrahend layer tuple.

required
include_inter bool

Include inter-layer edges touching layer_a.

False
include_coupling bool

Include coupling edges touching layer_a.

False

Returns:

Type Description
AnnNet
supra_adjacency
supra_adjacency(layers=None)

Build the supra adjacency matrix.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers. In single-aspect mode, string ids are accepted.

None

Returns:

Type Description
csr_matrix

Supra adjacency over the chosen vertex–layer index.

Examples:

A = G.supra_adjacency()
supra_incidence
supra_incidence(
    layers=None, include_inter=True, include_coupling=True
)

Build the supra-incidence matrix over selected layers.

Unlike supra_adjacency, this preserves the full hyperedge structure —
a k-ary hyperedge becomes a single column with k nonzero entries, with
stoichiometric coefficients intact. Binary intra, inter, coupling, and
hyperedges are all handled in a unified column-oriented representation.

Rows  : vertex-layer pairs (u, aa) — identical index to supra_adjacency,
        built by ensure_vertex_layer_index.
Cols  : one per selected edge, ordered as: intra edges (per layer, sorted
        by eid), then inter/coupling edges, then unassigned hyperedges last.

Column sign convention (matches _matrix):
    - Binary directed   : +w at source row, -w at target row
    - Binary undirected : +w at both rows
    - Hyperedge directed: +w at head rows, -w at tail rows (stoich-aware)
    - Hyperedge undirected: +w at all member rows (stoich-aware)
    - Inter/coupling    : +w at (u, La) row, -w at (v, Lb) row (directed)

Hyperedges MUST have a layer assignment in edge_layers (set via
set_edge_kivela_role(eid, "intra", layer_tuple) after add_hyperedge).
Hyperedges without a layer assignment are collected in the returned
skipped list and excluded from the matrix — they do NOT silently corrupt
the result.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers. None = all layers in V_M. Single-aspect string ids are accepted.

None
include_inter bool

Include inter-layer edges in the output columns. Default True.

True
include_coupling bool

Include coupling edges in the output columns. Default True.

True

Returns:

Name Type Description
B csr_matrix

Shape (|V_M|, |E_selected|). Rows are vertex-layer pairs in the order given by self._row_to_nl after ensure_vertex_layer_index.

edge_ids list[str]

Edge id for each column of B, in column order. Use this to map columns back to edges for interpretability.

skipped list[str]

Edge ids that were excluded because their layer assignment could not be resolved. Inspect these if B looks sparse.

Notes
The hypergraph random-walk diffusion operator follows directly::

    B_csr = B  (this output)
    D_v = diag(|B| @ ones)          # vertex degree (sum of |entries| per row)
    D_e = diag(|B|.T @ ones)        # edge degree (sum of |entries| per col)
    Theta = D_v_inv @ B @ D_e_inv @ B.T

Examples:

    B, eids, skipped = G.supra_incidence()
build_intra_block
build_intra_block(layers=None)

Supra matrix containing only intra-layer edges (diagonal blocks).

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
csr_matrix
build_inter_block
build_inter_block(layers=None)

Supra matrix containing only inter-layer (non-diagonal) edges.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
csr_matrix
build_coupling_block
build_coupling_block(layers=None)

Supra matrix containing only coupling edges.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
csr_matrix
supra_degree
supra_degree(layers=None)

Degree vector over the supra-graph.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
ndarray
supra_laplacian
supra_laplacian(kind='comb', layers=None)

Build supra-Laplacian.

Parameters:

Name Type Description Default
kind str

"comb" for combinatorial L = D - A or "norm" for normalized L = I - D^{-1/2} A D^{-1/2}.

'comb'
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
csr_matrix
add_layer_coupling_pairs
add_layer_coupling_pairs(layer_pairs, *, weight=1.0)

Add diagonal couplings for explicit layer pairs.

Parameters:

Name Type Description Default
layer_pairs list[tuple[tuple[str, ...], tuple[str, ...]]]

Layer tuple pairs (aa, bb).

required
weight float

Edge weight.

1.0

Returns:

Type Description
int

Number of edges added.

add_categorical_coupling
add_categorical_coupling(aspect, groups, *, weight=1.0)

Add categorical couplings along one aspect.

Parameters:

Name Type Description Default
aspect str

Aspect name to couple over.

required
groups list[list[str]]

Groups of elementary labels to fully connect per vertex.

required
weight float

Edge weight.

1.0

Returns:

Type Description
int

Number of edges added.

add_diagonal_coupling_filter
add_diagonal_coupling_filter(layer_filter, *, weight=1.0)

Add diagonal couplings within a filtered layer subspace.

Parameters:

Name Type Description Default
layer_filter dict[str, set]

Aspect filters (e.g., {"time": {"t1","t2"}}).

required
weight float

Edge weight.

1.0

Returns:

Type Description
int

Number of edges added.

tensor_index
tensor_index(layers=None)

Build indices for tensor view.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
tuple

(vertices, layers_t, vertex_to_i, layer_to_i).

Examples:

vertices, layers_t, v2i, l2i = G.tensor_index()
adjacency_tensor_view
adjacency_tensor_view(layers=None)

Sparse 4-index adjacency view.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
dict

{"vertices","layers","vertex_to_i","layer_to_i","ui","ai","vi","bi","w"}.

Notes

Symmetric entries are emitted twice: (ui, ai, vi, bi) and (vi, bi, ui, ai).

flatten_to_supra
flatten_to_supra(tensor_view)

Flatten a tensor view into a supra adjacency matrix.

Parameters:

Name Type Description Default
tensor_view dict

Output of :meth:adjacency_tensor_view or :meth:unflatten_from_supra.

required

Returns:

Type Description
csr_matrix
unflatten_from_supra
unflatten_from_supra(A, layers=None)

Unflatten a supra adjacency matrix into a tensor view.

Parameters:

Name Type Description Default
A spmatrix

Supra adjacency matrix.

required
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
dict

Tensor view with the same schema as :meth:adjacency_tensor_view.

supra_adjacency_scaled
supra_adjacency_scaled(
    *, coupling_scale=1.0, include_inter=True, layers=None
)

Build scaled supra adjacency.

Parameters:

Name Type Description Default
coupling_scale float

Scaling factor for coupling edges.

1.0
include_inter bool

Whether to include inter-layer edges.

True
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
csr_matrix
transition_matrix
transition_matrix(layers=None)

Row-stochastic transition matrix P = D^{-1} A.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
csr_matrix
random_walk_step
random_walk_step(p, layers=None)

One random-walk step p' = p P.

Parameters:

Name Type Description Default
p array - like

Row vector of length |V_M|.

required
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
ndarray
diffusion_step
diffusion_step(x, tau=1.0, kind='comb', layers=None)

One explicit Euler step of diffusion on the supra-graph.

Parameters:

Name Type Description Default
x array - like

State vector of length |V_M|.

required
tau float

Time step.

1.0
kind str

"comb" or "norm".

'comb'
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
ndarray
algebraic_connectivity
algebraic_connectivity(layers=None)

Algebraic connectivity of the supra-graph.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
tuple[float, ndarray | None]

(lambda_2, fiedler_vector) or (0.0, None) if too small.

k_smallest_laplacian_eigs
k_smallest_laplacian_eigs(k=6, kind='comb', layers=None)

Return k smallest eigenvalues/eigenvectors of the supra-Laplacian.

Parameters:

Name Type Description Default
k int

Number of eigenpairs to compute.

6
kind str

"comb" or "norm".

'comb'
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
tuple[ndarray, ndarray]

(eigenvalues, eigenvectors).

dominant_rw_eigenpair
dominant_rw_eigenpair(layers=None)

Dominant eigenpair of the random-walk operator.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
tuple[float, ndarray | None]

(lambda_max, v).

sweep_coupling_regime
sweep_coupling_regime(
    scales, metric="algebraic_connectivity", layers=None
)

Scan coupling scales and evaluate a metric.

Parameters:

Name Type Description Default
scales Iterable[float]

Coupling scales to evaluate.

required
metric str | callable

"algebraic_connectivity" or a callable metric(A)->float.

'algebraic_connectivity'
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
list[float]

Metric values aligned with scales.

layer_degree_vectors
layer_degree_vectors(layers=None)

Per-layer degree vectors (intra-layer only).

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
dict

{layer_tuple: (rows_idx_list, deg_vector_np)}.

participation_coefficient
participation_coefficient(layers=None)

Participation coefficient per vertex.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
dict[str, float]
versatility
versatility(layers=None)

Versatility proxy based on dominant eigenvector of supra adjacency.

Parameters:

Name Type Description Default
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers.

None

Returns:

Type Description
dict[str, float]
multislice_modularity
multislice_modularity(
    partition,
    *,
    gamma=1.0,
    omega=1.0,
    include_inter=False,
    layers=None
)

Mucha et al. multislice modularity (scorer only).

Parameters:

Name Type Description Default
partition array - like

Community ids, length |V_M| in the current index.

required
gamma float

Resolution parameter.

1.0
omega float

Coupling strength (binary coupling structure scaled by omega).

1.0
include_inter bool

Whether to include inter-layer (non-diagonal) edges.

False
layers list[str] | list[tuple[str, ...]] | None

Optional subset of layers to score on.

None

Returns:

Type Description
float

Modularity score Q.

Examples:

Q = G.multislice_modularity(partition)