Skip to content

Commit 19aa127

Browse files
InterdisciplinaryPhysicsTeampitmonticoneClaudMor
committed
Fix docs
Co-Authored-By: Pietro Monticone <[email protected]> Co-Authored-By: Claudio Moroni <[email protected]>
1 parent 8300b6b commit 19aa127

File tree

6 files changed

+180
-140
lines changed

6 files changed

+180
-140
lines changed

docs/make.jl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,6 @@ using Graphs
55
using MultilayerGraphs
66
using Documenter
77

8-
#= function end_user_filter(f)
9-
if f isa Function
10-
for method in methods
11-
tv, decls, file, line = arg_decl_parts(m)
12-
13-
end =#
14-
158
DocMeta.setdocmeta!(
169
MultilayerGraphs, :DocTestSetup, :(using MultilayerGraphs); recursive=true
1710
)
@@ -26,7 +19,7 @@ makedocs(;
2619
canonical="https://juliagraphs.org/MultilayerGraphs.jl",
2720
assets=String[],
2821
),
29-
pages=["Home" => "index.md", "API" => "API_organized.md"],
22+
pages=["Home" => "index.md", "API" => "API.md"],
3023
clean=false,
3124
)
3225

docs/src/API_organized.md renamed to docs/src/API.md

Lines changed: 147 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# API
22

3-
This page provides a list of exported methods organized by topic and audience. Methods that act on vertices, edges, and layers are grouped together. Some methods are intended for developers who want to use the `Graphs.jl` library as part of their code, while others are meant for end-users. hello
3+
This page provides a list of exported methods organized by topic and audience. Methods that act on vertices, edges, and layers are grouped together. Some methods are intended for developers who want to use the `Graphs.jl` library as part of their code, while others are meant for end-users.
44

55
## End-User
66

@@ -171,122 +171,44 @@ graph(subgraph::AbstractSubGraph)
171171
### [Multilayer-Specific Methods](@id msm_eu)
172172

173173
```@docs
174-
MultilayerGraph{T,U}
175-
176-
MultilayerDiGraph{T,U}
177-
178-
MultilayerGraph(T::Type{<:Number}, U::Type{<:Number})
179-
180-
MultilayerDiGraph(T::Type{<:Number}, U::Type{<:Number})
181-
182-
MultilayerGraph(
183-
layers::Vector{<:Layer{T,U}},
184-
specified_interlayers::Vector{<:Interlayer{T,U}};
185-
default_interlayers_null_graph::H = SimpleGraph{T}(),
186-
default_interlayers_structure::String="multiplex",
187-
) where {T,U, H <: AbstractGraph{T}}
188-
189-
MultilayerDiGraph(
190-
layers::Vector{<:Layer{T,U}},
191-
specified_interlayers::Vector{<:Interlayer{T,U}};
192-
default_interlayers_null_graph::H = SimpleGraph{T}(),
193-
default_interlayers_structure::String="multiplex",
194-
) where {T,U, H <: AbstractGraph{T}}
195-
196-
MultilayerGraph(
197-
empty_layers::Vector{<:Layer{T,U}},
198-
empty_interlayers::Vector{<:Interlayer{T,U}},
199-
degree_distribution::UnivariateDistribution;
200-
allow_self_loops::Bool = false,
201-
default_interlayers_null_graph::H = SimpleGraph{T}(),
202-
) where {T <: Integer, U <: Real, H <: AbstractGraph{T}}
203-
204-
MultilayerDiGraph(
205-
empty_layers::Vector{<:Layer{T,U}},
206-
empty_interlayers::Vector{<:Interlayer{T,U}},
207-
indegree_distribution::UnivariateDistribution,
208-
outdegree_distribution::UnivariateDistribution;
209-
allow_self_loops::Bool = false,
210-
default_interlayers_null_graph::H = SimpleGraph{T}(),
211-
) where {T <: Integer, U <: Real, H <: AbstractGraph{T}}
212-
213-
MultilayerGraph(
214-
empty_multilayergraph::MultilayerGraph{T,U},
215-
degree_sequence::Vector{<:Integer};
216-
allow_self_loops::Bool = false,
217-
perform_checks::Bool = true
218-
) where {T,U}
219-
220-
MultilayerDiGraph(
221-
empty_multilayerdigraph::MultilayerDiGraph{T,U},
222-
indegree_sequence::Vector{<:Integer},
223-
outdegree_sequence::Vector{<:Integer};
224-
allow_self_loops::Bool = false,
225-
perform_checks::Bool = false
226-
) where {T,U}
227-
228-
NodeAlignedEdgeColoredGraph{T,U}
229-
230-
NodeAlignedEdgeColoredGraph(
231-
layers::Vector{<:Layer{T,U}},
232-
) where {T,U}
233-
234-
NodeAlignedEdgeColoredDiGraph{T,U}
235-
236-
174+
AbstractMultilayerGraph{T <: Integer, U <: Real}
237175
176+
has_node(mg::AbstractMultilayerGraph, n::Node)
238177
nodes(mg::AbstractMultilayerGraph)
239-
nn(mg::AbstractMultilayerGraph)
240-
<!-- add_node!(mg::AbstractMultilayerGraph, n::Node; add_vertex_to_layers::Union{Vector{Symbol}, Symbol}) -->
241-
<!-- rem_node!(mg::AbstractMultilayerGraph, n::Node) -->
178+
nn(mg::AbstractMultilayerGraph)
179+
242180
has_vertex(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
243181
nv(mg::M) where {M <: AbstractMultilayerGraph }
244182
mv_vertices(mg::AbstractMultilayerGraph)
183+
get_metadata(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
184+
set_metadata!(mg::AbstractMultilayerGraph, mv::MultilayerVertex, metadata::Union{Tuple, NamedTuple})
185+
245186
mv_inneighbors(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
246187
mv_outneighbors(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
247188
mv_neighbors( mg::AbstractMultilayerGraph, mv::MultilayerVertex)
248-
<!-- add_vertex!(mg::AbstractMultilayerGraph, mv::MultilayerVertex; add_node::Bool) -->
249-
<!-- rem_vertex!(mg::AbstractMultilayerUGraph, V::MultilayerVertex) -->
250-
<!-- rem_vertex!(mg::AbstractMultilayerDiGraph, V::MultilayerVertex) -->
251189
has_edge(mg::AbstractMultilayerGraph, edge::MultilayerEdge)
252-
has_edge( subgraph::AbstractMultilayerGraph, s::MultilayerVertex, d::MultilayerVertex)
190+
has_edge(mg::AbstractMultilayerGraph, src::MultilayerVertex, dst::MultilayerVertex)
253191
ne(mg::AbstractMultilayerGraph)
254-
<!-- edges(mg::AbstractMultilayerUGraph) -->
255-
<!-- edges(mg::M) where {T,U,M<:AbstractMultilayerUGraph{T,U}} -->
256-
edges(mg::M) where {T,U,M<:AbstractMultilayerGraph{T,U}}
257-
edges
192+
edges(::Type{IsDirected{M}}, mg::M) where {T, U, M<:AbstractMultilayerGraph{T, U}}
193+
edges(::Type{Not{IsDirected{M}}}, mg::M) where {T, U, M<:AbstractMultilayerGraph{T, U}}
258194
add_edge!(mg::M, src::V, dst::V; weight::Union{Nothing, U} = one(U), metadata::Union{Tuple,NamedTuple} = NamedTuple() ) where {T,U, M <: AbstractMultilayerGraph{T,U}, V <: MultilayerVertex}
259-
add_edge!(mg::M, me::E) where {T,U, M <: AbstractMultilayerGraph{T,U}, E <: MultilayerEdge{ <: Union{U,Nothing}}}
260195
rem_edge!(mg::AbstractMultilayerGraph, me::MultilayerEdge)
261-
rem_edge!(mg::MultilayerGraph, src::MultilayerVertex, dst::MultilayerVertex)
262-
rem_edge!(mg::MultilayerDiGraph, src::MultilayerVertex, dst::MultilayerVertex)
263-
get_metadata(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
264196
get_metadata(mg::AbstractMultilayerGraph, src::MultilayerVertex, dst::MultilayerVertex)
265197
get_weight(mg::AbstractMultilayerGraph, src::MultilayerVertex, dst::MultilayerVertex)
266-
<!-- set_weight!(mg::M, src::MultilayerVertex, dst::MultilayerVertex, weight::U) where { T,U, M <: AbstractMultilayerUGraph{T,U}}
267-
set_weight!(mg::M, src::MultilayerVertex, dst::MultilayerVertex, weight::U) where {T,U,M<:AbstractMultilayerGraph{T,U}; IsDirected{M}} -->
268-
set_weight!
269-
<!-- is_directed(mg::AbstractMultilayerUGraph) -->
270-
<!-- is_directed(m::M) where { M <: Type{ <: AbstractMultilayerUGraph}} -->
271-
<!-- is_directed(mg::AbstractMultilayerDiGraph)
272-
is_directed(m::M) where { M <: Type{ <: AbstractMultilayerDiGraph}} -->
273-
has_node(mg::AbstractMultilayerGraph, n::Node)
274-
<!-- set_metadata!(mg::AbstractMultilayerGraph, mv::MultilayerVertex, metadata::Union{Tuple, NamedTuple})
275-
<!-- set_metadata!(mg::AbstractMultilayerDiGraph, src::MultilayerVertex, dst::MultilayerVertex, metadata::Union{Tuple, NamedTuple}) -->
276-
set_metadata!(mg::AbstractMultilayerUGraph, src::MultilayerVertex, dst::MultilayerVertex, metadata::Union{Tuple, NamedTuple}) -->
277-
set_metadata!
198+
set_weight!(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M, src::MultilayerVertex, dst::MultilayerVertex, weight::U) where {T, U, M<:AbstractMultilayerGraph{T, U}}
199+
set_weight!(::Type{Graphs.IsDirected{M}}, mg::M, src::MultilayerVertex, dst::MultilayerVertex, weight::U) where {T, U, M<:AbstractMultilayerGraph{T, U}}
200+
set_metadata!(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M, src::MultilayerVertex, dst::MultilayerVertex, metadata::Union{Tuple, NamedTuple}) where {M<:AbstractMultilayerGraph}
201+
set_metadata!(::Type{Graphs.IsDirected{M}}, mg::M, src::MultilayerVertex, dst::MultilayerVertex, metadata::Union{Tuple, NamedTuple}) where {M<:AbstractMultilayerGraph}
202+
203+
278204
nl(mg::AbstractMultilayerGraph)
279205
nIn(mg::AbstractMultilayerGraph)
280206
has_layer(mg::AbstractMultilayerGraph, layer_name::Symbol)
281207
282-
<!-- add_layer!(mg::M, new_layer::L; default_interlayers_null_graph::H = SimpleGraph{T}(), default_interlayers_structure::String ="multiplex"
283-
) where {T,U,G<:AbstractGraph{T},M<:AbstractMultilayerUGraph{T,U},L<:Layer{T,U,G}, H <: AbstractGraph{T}} -->
284-
285-
<!-- add_layer!(
286-
mg::M, new_layer::L; default_interlayers_null_graph::H = SimpleGraph{T}(), default_interlayers_structure::String ="multiplex"
287-
) where {T,U,G<:AbstractGraph{T},M<:AbstractMultilayerDiGraph{T,U},L<:Layer{T,U,G}, H <: AbstractGraph{T}} -->
288-
289-
specify_interlayer!
208+
add_layer!(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M, new_layer::L; default_interlayers_null_graph, default_interlayers_structure) where {T, U, G<:Graphs.AbstractGraph{T}, L<:Layer{T, U, G}, M<:MultilayerGraph{T, U}}
209+
add_layer!(::Type{Graphs.IsDirected{M}}, mg::M, new_layer::L; default_interlayers_null_graph, default_interlayers_structure) where {T, U, G<:Graphs.AbstractGraph{T}, L<:Layer{T, U, G}, M<:MultilayerDiGraph{T, U}}
210+
specify_interlayer!(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M, new_interlayer::In) where {T, U, G<:Graphs.AbstractGraph{T}, In<:Interlayer{T, U, G}, M<:MultilayerGraph{T, U}}
211+
specify_interlayer!(::Type{Graphs.IsDirected{M}}, mg::M, new_interlayer::In) where {T, U, G<:Graphs.AbstractGraph{T}, In<:Interlayer{T, U, G}, M<:MultilayerDiGraph{T, U}}
290212
291213
get_interlayer(
292214
mg::AbstractMultilayerGraph, layer_1_name::Symbol, layer_2_name::Symbol
@@ -299,7 +221,9 @@ indegree(mg::AbstractMultilayerGraph, vs::AbstractVector{<:MultilayerVertex}=ver
299221
outdegree(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
300222
outdegree(mg::AbstractMultilayerGraph, vs::AbstractVector{<:MultilayerVertex}=vertices(mg))
301223
302-
degree(mg::AbstractMultilayerGraph, vs::AbstractVector{<:MultilayerVertex}=vertices(mg))
224+
degree(mg::AbstractMultilayerGraph, vs::AbstractVector{<:MultilayerVertex})
225+
degree(::Type{Graphs.IsDirected{M}}, mg::M, mv::V) where {M<:AbstractMultilayerGraph, V<:MultilayerVertex}
226+
degree(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M, v::V) where {M<:AbstractMultilayerGraph, V<:MultilayerVertex}
303227
304228
mean_degree(mg::AbstractMultilayerGraph)
305229
@@ -327,9 +251,125 @@ modularity(
327251
) where {T,U,M<:AbstractMultilayerGraph{T,U}}
328252
329253
330-
<!-- von_neumann_entropy(mg::M) where {T,U,M<:AbstractMultilayerUGraph{T,U}} -->
254+
von_neumann_entropy(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M) where {T, U, M<:AbstractMultilayerGraph{T, U}}
255+
331256
```
332257

258+
### Concrete Multilayer Graphs
259+
#### [(General) Multilayer Graphs](@id General_Multilayer_Graphs_eu)
260+
##### [MultilayerGraph](@id Multilayer_Graph)
261+
```@docs
262+
MultilayerGraph{T,U}
263+
264+
MultilayerGraph(T::Type{<:Number}, U::Type{<:Number})
265+
266+
MultilayerGraph(
267+
layers::Vector{<:Layer{T,U}},
268+
specified_interlayers::Vector{<:Interlayer{T,U}};
269+
default_interlayers_null_graph::H = SimpleGraph{T}(),
270+
default_interlayers_structure::String="multiplex",
271+
) where {T,U, H <: AbstractGraph{T}}
272+
273+
MultilayerGraph(
274+
empty_layers::Vector{<:Layer{T,U}},
275+
empty_interlayers::Vector{<:Interlayer{T,U}},
276+
degree_distribution::UnivariateDistribution;
277+
allow_self_loops::Bool = false,
278+
default_interlayers_null_graph::H = SimpleGraph{T}(),
279+
) where {T <: Integer, U <: Real, H <: AbstractGraph{T}}
280+
281+
MultilayerGraph(
282+
empty_multilayergraph::MultilayerGraph{T,U},
283+
degree_sequence::Vector{<:Integer};
284+
allow_self_loops::Bool = false,
285+
perform_checks::Bool = true
286+
) where {T,U}
287+
288+
add_node!(mg::MultilayerGraph, n::Node; add_vertex_to_layers)
289+
rem_node!(mg::MultilayerGraph, n::Node)
290+
291+
add_vertex!(mg::MultilayerGraph, mv::MultilayerVertex; add_node::Bool=true)
292+
rem_vertex!(mg::MultilayerGraph, V::MultilayerVertex)
293+
294+
add_edge!(mg::M, me::E) where {T, U, M<:MultilayerGraph{T, U}, E<:(MultilayerEdge{<:Union{Nothing, U}})}
295+
rem_edge!(mg::MultilayerGraph, src::MultilayerVertex, dst::MultilayerVertex)
296+
297+
is_directed(mg::M) where {M<:Type{<:MultilayerGraph}}
298+
299+
```
300+
##### [MultilayerDiGraph](@id Multilayer_Di_Graph_eu)
301+
```@docs
302+
MultilayerDiGraph{T,U}
303+
304+
MultilayerDiGraph(T::Type{<:Number}, U::Type{<:Number})
305+
306+
MultilayerDiGraph(
307+
layers::Vector{<:Layer{T,U}},
308+
specified_interlayers::Vector{<:Interlayer{T,U}};
309+
default_interlayers_null_graph::H = SimpleGraph{T}(),
310+
default_interlayers_structure::String="multiplex",
311+
) where {T,U, H <: AbstractGraph{T}}
312+
313+
MultilayerDiGraph(
314+
empty_layers::Vector{<:Layer{T,U}},
315+
empty_interlayers::Vector{<:Interlayer{T,U}},
316+
indegree_distribution::UnivariateDistribution,
317+
outdegree_distribution::UnivariateDistribution;
318+
allow_self_loops::Bool = false,
319+
default_interlayers_null_graph::H = SimpleGraph{T}(),
320+
) where {T <: Integer, U <: Real, H <: AbstractGraph{T}}
321+
322+
MultilayerDiGraph(
323+
empty_multilayerdigraph::MultilayerDiGraph{T,U},
324+
indegree_sequence::Vector{<:Integer},
325+
outdegree_sequence::Vector{<:Integer};
326+
allow_self_loops::Bool = false,
327+
perform_checks::Bool = false
328+
) where {T,U}
329+
330+
add_node!(mg::MultilayerDiGraph, n::Node; add_vertex_to_layers)
331+
rem_node!(mg::MultilayerDiGraph, n::Node)
332+
333+
add_vertex!(mg::MultilayerDiGraph, mv::MultilayerVertex; add_node::Bool=true)
334+
rem_vertex!(mg::MultilayerDiGraph, V::MultilayerVertex)
335+
336+
add_edge!(mg::M, me::E) where {T, U, M<:MultilayerDiGraph{T, U}, E<:(MultilayerEdge{<:Union{Nothing, U}})}
337+
rem_edge!(mg::MultilayerDiGraph, src::MultilayerVertex, dst::MultilayerVertex)
338+
339+
is_directed(mg::M) where {M<:Type{<:MultilayerDiGraph}}
340+
```
341+
342+
#### [Node Aligned Edge Colored Graphs](@id Node_Aligned_Edge_Colored_Graphs_eu)
343+
```@docs
344+
AbstractNodeAlignedEdgeColoredGraph
345+
346+
add_node!(mg::AbstractNodeAlignedEdgeColoredGraph, n::Node)
347+
rem_node!(mg::AbstractNodeAlignedEdgeColoredGraph, n::Node)
348+
349+
add_edge!(mg::M, me::E) where {T, U, M<:AbstractNodeAlignedEdgeColoredGraph{T, U}, E<:(MultilayerEdge{<:Union{Nothing, U}})}
350+
rem_edge!(mg::AbstractNodeAlignedEdgeColoredGraph, src::MultilayerVertex, dst::MultilayerVertex)
351+
352+
add_layer!(mg::M, new_layer::L) where {T, U, G<:Graphs.AbstractGraph{T}, L<:Layer{T, U, G}, M<:AbstractNodeAlignedEdgeColoredGraph{T, U}}
353+
```
354+
##### [NodeAlignedEdgeColoredGraph](@id Node_Aligned_Edge_Colored_Graph_eu)
355+
```@docs
356+
NodeAlignedEdgeColoredGraph{T,U}
357+
358+
NodeAlignedEdgeColoredGraph(layers::Vector{<:Layer{T,U}}) where {T,U}
359+
360+
is_directed(mg::M) where {M<:Type{<:NodeAlignedEdgeColoredGraph}}
361+
```
362+
363+
##### [NodeAlignedEdgeColoredDiGraph](@id Node_Aligned_Edge_Colored_Di_Graph_eu)
364+
```@docs
365+
NodeAlignedEdgeColoredDiGraph{T,U}
366+
367+
NodeAlignedEdgeColoredDiGraph(layers::Vector{<:Layer{T,U}}) where {T,U}
368+
369+
is_directed(mg::M) where {M<:Type{<:NodeAlignedEdgeColoredDiGraph}}
370+
```
371+
372+
333373
### [Representations](@id representations_eu)
334374
```@docs
335375
array(atr::AbstractTensorRepresentation)
@@ -415,25 +455,18 @@ AbstractInterlayer
415455
### [Multilayer-Specific Methods](@id msm_dev)
416456

417457
```@docs
418-
AbstractMultilayerGraph{T <: Integer, U <: Real}
419-
fadjlist
420458
has_vertex(mg::M, v::T) where {T, M <: AbstractMultilayerGraph{T}}
421459
vertices(mg::AbstractMultilayerGraph)
422-
<!-- inneighbors(mg::M, v::T) where {T,M<:AbstractMultilayerUGraph{T,<:Real}} -->
423-
inneighbors(mg::M, v::T) where {T, M<:AbstractMultilayerGraph{T,<:Real}}
460+
inneighbors(::Type{SimpleTraits.Not{Graphs.IsDirected{M}}}, mg::M, v::T) where {T, M<:AbstractMultilayerGraph}
461+
inneighbors(::Type{Graphs.IsDirected{M}}, mg::M, v::T) where {T, M<:AbstractMultilayerGraph}
424462
inneighbors(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
425463
outneighbors(mg::M, v::T) where {T, M<:AbstractMultilayerGraph{T}}
426464
neighbors(mg::AbstractMultilayerGraph, mv::MultilayerVertex)
427465
edgetype(::M) where {T,U,M<:AbstractMultilayerGraph{T,U}}
428-
<!-- has_edge(mg::M, src::T, dst::T) where { T, M <: AbstractMultilayerUGraph{T}}
429-
has_edge(mg::M, src::T, dst::T) where {T,M<:AbstractMultilayerGraph{T}; IsDirected{M}} -->
430-
has_edge
431-
add_edge!(mg::M,src::T,dst::T;weight::Union{Nothing,U}=one(U),metadata::Union{Tuple,NamedTuple}=NamedTuple(),) where {T,U,M<:AbstractMultilayerGraph{T,U}}
432-
rem_edge!(mg::M, src::T, dst::T) where {T, M <: AbstractMultilayerGraph{T}
433-
<!-- AbstractMultilayerUGraph{T,U} -->
434-
<!-- AbstractMultilayerDiGraph{T,U} -->
435-
AbstractMultiplexUGraph
436-
AbstractMultiplexDiGraph
466+
has_edge(::Type{Not{IsDirected{M}}}, mg::M, src::T, dst::T) where {T, M<:(AbstractMultilayerGraph{T})}
467+
has_edge(::Type{IsDirected{M}}, mg::M, src::T, dst::T) where {T, M<:(AbstractMultilayerGraph{T})}
468+
add_edge!(mg::M, src::T, dst::T; weight, metadata) where {T, U, M<:AbstractMultilayerGraph{T, U}}
469+
rem_edge!(mg::M, src::T, dst::T) where {T, M<:(AbstractMultilayerGraph{T})}
437470
```
438471

439472
### [Representations](@id representations_dev)
@@ -446,5 +479,4 @@ AbstractMatrixRepresentation{T,U}
446479
```@docs
447480
IsWeighted{X}
448481
IsMeta{X}
449-
IsMultiplex{X}
450482
```

docs/src/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,9 +943,9 @@ The package also exports a [`SupraWeightMatrix`](@ref) which is a supra (weighte
943943
#### Sub-ecosystem
944944
Special applications may not require all the representational generality enabled by `Multilayer(Di)Graph`s, and, on the contrary, could benefit from the simpler interface and higher performance that come with restricted subtypes of multilayer graphs (e.g. multiplex graphs, edge-colored graph, etc).
945945

946-
MultilayerGraphs.jl, via an apporoach that combines type-hierarchy with traits, allows for implementing custom multilayer graphs (similar to what Graphs.jl does). This feature has been initially proven with the implementation of [`SynchronizedEdgeColoredGraph`](@ref) and [`SynchronizedEdgeColoredDiGraph`](@ref), which aim at representing edge-colored graphs by naturally mapping them to multilayer graphs.
947-
946+
MultilayerGraphs.jl, via an apporoach that combines type-hierarchy with traits, allows for implementing custom multilayer graphs (similar to what Graphs.jl does). This feature has been initially proven with the implementation of [`NodeAlignedEdgeColoredGraph`](@ref) and [`NodeAlignedEdgeColoredDiGraph`](@ref), which aim at representing edge-colored graphs by naturally mapping them to multilayer graphs.
948947

948+
The sub-ecosystem capability is still under construction, see [Systematize the sub-ecosytem feature](https://github.com/JuliaGraphs/MultilayerGraphs.jl/issues/113).
949949

950950
#### Multilayer-specific analytical tools
951951

0 commit comments

Comments
 (0)