**Bug fixes**
- all input node legs and pre-processing steps are now calculated lazily,
allowing slicing of indices including those 'simplified' away {issue}`31`.
- make [`tree.peak_size`](cotengra.ContractionTree.peak_size) more accurate,
by taking max assuming left, right and parent intermediate tensors are all
present at the same time.
**Enhancements**
- add simulated annealing tree refinement (in `path_simulated_annealing.py`),
based on "Multi-Tensor Contraction for XEB Verification of
Quantum Circuits" by Gleb Kalachev, Pavel Panteleev, Man-Hong Yung
(arXiv:2108.05665), and the "treesa" implementation in
OMEinsumContractionOrders.jl by Jin-Guo Liu and Pan Zhang. This can be
accessed most easily by supplying
`opt = HyperOptimizer(simulated_annealing_opts={})`.
- add [`ContractionTree.plot_flat`](cotengra.plot.plot_tree_flat): a new method
for plotting the contraction tree as a flat diagram showing all indices on
every intermediate (without requiring any graph layouts), which is useful for
visualizing and understanding small contractions.
- [`HyperGraph.plot`](cotengra.plot.plot_hypergraph): support showing hyper
outer indices, multi-edges, and automatic unique coloring of nodes and
indices (to match `plot_flat`).
- add [`ContractionTree.plot_circuit](cotengra.plot.plot_tree_circuit) for
plotting the contraction tree as a circuit diagram, which is fast and useful
for visualizing the traversal ordering for larger trees.
- add [`ContractionTree.restore_ind`](cotengra.ContractionTree.restore_ind)
for 'unslicing' or 'unprojecting' previously removed indices.
- [`ContractionTree.from_path`](cotengra.ContractionTree.from_path): add option
`complete` to automatically complete the tree given an incomplete path
(usually disconnected subgraphs - {issue}`29`).
- add [`ContractionTree.get_incomplete_nodes`](cotengra.ContractionTree.get_incomplete_nodes)
for finding all uncontracted childless-parentless node groups.
- add [`ContractionTree.autocomplete`](cotengra.ContractionTree.autocomplete)
for automatically completing a contraction tree, using above method.
- [`tree.plot_flat`](cotengra.plot.plot_tree_flat): show any preprocessing
steps and optionally list sliced indices
- add [get_rng](cotengra.utils.get_rng) as a single entry point for getting or
propagating a random number generator, to help determinism.
- set ``autojit="auto"`` for contractions, which by default turns on jit for
`backend="jax"` only.
- add [`tree.describe`](cotengra.ContractionTree.describe) for a various levels
of information about a tree, e.g. `tree.describe("full")` and
`tree.describe("concise")`.
- add [ctg.GreedyOptimizer](cotengra.pathfinders.path_basic.GreedyOptimizer)
and [ctg.OptimalOptimizer](cotengra.pathfinders.path_basic.OptimalOptimizer)
to the top namespace.
- add [ContractionTree.benchmark](cotengra.ContractionTree.benchmark) for
for automatically assessing hardware performance vs theoretical cost.
- contraction trees now have a `get_default_objective` method to return the
objective function they were optimized with, for simpler further refinement
or scoring, where it is now picked up automatically.
- change the default 'sub' optimizer on divisive partition building algorithms
to be `'greedy'` rather than `'auto'`. This might make individual trials
slightly worse but makes each cheaper, see discussion: ({issue}`27`).