https://github.com/algebraicjulia/cliquetrees.jl
A Julia library for computing tree decompositions and chordal completions of graphs.
https://github.com/algebraicjulia/cliquetrees.jl
datastructures graphs graphs-algorithms julia tree-decompositions
Last synced: 2 months ago
JSON representation
A Julia library for computing tree decompositions and chordal completions of graphs.
- Host: GitHub
- URL: https://github.com/algebraicjulia/cliquetrees.jl
- Owner: AlgebraicJulia
- License: mit
- Created: 2025-02-11T16:46:31.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2025-04-11T21:18:24.000Z (2 months ago)
- Last Synced: 2025-04-14T23:15:33.518Z (2 months ago)
- Topics: datastructures, graphs, graphs-algorithms, julia, tree-decompositions
- Language: Julia
- Homepage: https://algebraicjulia.github.io/CliqueTrees.jl/
- Size: 1.21 MB
- Stars: 14
- Watchers: 3
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![]()
CliqueTrees.jl
CliqueTrees.jl implements *clique trees* in Julia. You can use it to construct [tree decompositions](https://en.wikipedia.org/wiki/Tree_decomposition) and [chordal completions](https://en.wikipedia.org/wiki/Chordal_completion) of graphs.
## Installation
To install CliqueTrees.jl, enter the Pkg REPL by typing `]` and run the following command.
```julia-repl
pkg> add CliqueTrees
```## Basic Usage
### Tree Decompositions
The function `cliquetree` computes tree decompositions.
```julia-repl
julia> using CliqueTrees, LinearAlgebra, SparseArraysjulia> graph = [
0 1 0 0 0 0 0 0
1 0 1 0 0 1 0 0
0 1 0 1 0 1 1 1
0 0 1 0 0 0 0 0
0 0 0 0 0 1 1 0
0 1 1 0 1 0 0 0
0 0 1 0 1 0 0 1
0 0 1 0 0 0 1 0
];julia> label, tree = cliquetree(graph);
julia> tree
6-element CliqueTree{Int64, Int64}:
[6, 7, 8]
└─ [5, 7, 8]
├─ [1, 5]
├─ [3, 5, 7]
│ └─ [2, 3]
└─ [4, 5, 8]
```The clique tree `tree` is a tree decomposition of the permuted graph `graph[label, label]`.
A clique tree is a vector of cliques, so you can retrieve the clique at node 4 by typing `tree[4]`.```julia-repl
julia> tree[4]
3-element Clique{Int64, Int64}:
4
5
8
```> [!WARNING]
> The numbers in each clique are vertices of the permuted graph `graph[label, label]`.
> You can see the vertices of the original graph by typing
> ```julia-repl
> julia> label[tree[4]]
> 3-element Vector{Int64}:
> 8
> 3
> 7
> ```
> Notice that the clique is no longer sorted.The width of a clique tree is computed by the function `treewidth`.
```julia-repl
julia> treewidth(tree)
2
```### Chordal Completions
Clique trees can be used to construct chordal completions.
```julia-repl
julia> filledgraph = FilledGraph(tree)
{8, 11} FilledGraph{Int64, Int64}julia> sparse(filledgraph)
8×8 SparseMatrixCSC{Bool, Int64} with 11 stored entries:
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
1 ⋅ 1 1 ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ 1 ⋅ 1 1 ⋅ ⋅
⋅ ⋅ ⋅ 1 1 1 1 ⋅
```The graph `filledgraph` is ordered: its edges are directed from lower to higher vertices. The underlying undirected graph is a chordal completion of the permuted graph `graph[label, label]`.
```julia-repl
julia> chordalgraph = Symmetric(sparse(filledgraph), :L)
8×8 Symmetric{Bool, SparseMatrixCSC{Bool, Int64}}:
⋅ ⋅ ⋅ ⋅ 1 ⋅ ⋅ ⋅
⋅ ⋅ 1 ⋅ ⋅ ⋅ ⋅ ⋅
⋅ 1 ⋅ ⋅ 1 ⋅ 1 ⋅
⋅ ⋅ ⋅ ⋅ 1 ⋅ ⋅ 1
1 ⋅ 1 1 ⋅ ⋅ 1 1
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 1 1
⋅ ⋅ 1 ⋅ 1 1 ⋅ 1
⋅ ⋅ ⋅ 1 1 1 1 ⋅julia> ischordal(graph)
falsejulia> ischordal(chordalgraph)
truejulia> all(graph[label, label] .<= chordalgraph)
true
```## Graphs
Users can input graphs as adjacency matrices. Additionally, CliqueTrees.jl supports the `HasGraph` type from [Catlab.jl](https://github.com/AlgebraicJulia/Catlab.jl) and the `AbstractGraph` type from [Graphs.jl](https://github.com/JuliaGraphs/Graphs.jl). Instances of the latter should implement the following subset of the [abstract graph interface](https://juliagraphs.org/Graphs.jl/stable/core_functions/interface/).
- `is_directed`
- `ne`
- `nv`
- `outneighbors`
- `vertices`Self-edges are always ignored.
## References
CliqueTrees.jl was inspired by the book [Chordal Graphs and Semidefinite Optimization](https://www.nowpublishers.com/article/Details/OPT-006) by Vandenberghe and Andersen.