Commit 39e867a
committed
Fix Qiskit#840: Add GraphML serializer
This commit adds a GraphML serializer:
```python
def write_graphml(
graphs: list[PyGraph | PyDiGraph],
keys: list[tuple[str, Domain, str, Type, Any]],
path: str,
/,
compression: str | None = ...,
) -> None: ...
```
`keys` is a list of tuples: id, domain, name of the key, type, and
default value. This commit also introduces the
`read_graphml_with_keys` function, which returns the key definitions
in the same format, along with the list of parsed graphs.
The implementation preserves the ids of graphs, nodes, and edges when
possible. If some ids conflict, fresh ids are generated in the written
GraphML file. The `read_graphml` function has also been updated to
store the graph id in the graph attributes, just like node and edge
ids are stored in the corresponding attributes.
The `write_graphml` function supports gzip compression, as does
`read_graphml`.
Note that the JSON node-link serializer (the other part of Qiskit#840) was
already implemented in Qiskit#1091.
Compared to Qiskit#1462:
- Keys are passed explicitly instead of being inferred (which allows
to use the types `float` and `int`, and to use default values);
- Attributes for graphs, nodes, and edges are taken from the weight of elements, instead of relying on callbacks. This allows write_graphml to act as a proper reciprocal of read_graphml. Round-trip tests have been added.
- IDs are taken from attributes when possible, instead of being generated from indices.
- Multiple graphs can be written to the same file.
- Gzip compression is supported.
- Tests have been added.
Regarding @IvanIsCoding's
comment (Qiskit#1462 (comment)),
about using https://github.com/jonasbb/petgraph-graphml:
- Rustworkx's `graphml.rs` introduces an internal `Graph` data
structure, which is used for `read_graphml`. It is natural to
have `write_graphml` rely on the same data structure.
- `petgraph-graphml` generates ids from indices, which prevents us
from preserving ids accross the `read_graphml`/`write_graphml` round
trip.1 parent 408397f commit 39e867a
4 files changed
Lines changed: 741 additions & 57 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
71 | 85 | | |
72 | 86 | | |
73 | 87 | | |
| |||
680 | 694 | | |
681 | 695 | | |
682 | 696 | | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
683 | 702 | | |
684 | 703 | | |
685 | 704 | | |
686 | 705 | | |
687 | 706 | | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
688 | 714 | | |
689 | 715 | | |
690 | 716 | | |
| |||
0 commit comments