**Bug fixes**
- all input node legs and pre-processing steps are now calculated lazily, allowing slicing of indices including those 'simplified' away 31.
- make [`tree.peak_size`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#cotengra.ContractionTree.peak_size) more accurate, by taking max assuming left, right and parent present at the same time.
**Enhancements**
- add simulated annealing tree refinement (in [`path_simulated_annealing.py`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/pathfinders/path_simulated_annealing/index.html)), 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`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/plot/index.html#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.
![image](https://github.com/jcmgray/cotengra/assets/8982598/32e82937-ab4f-4e0e-91fd-93d389489e29)
- [`HyperGraph.plot`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/plot/index.html#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](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/plot/index.html#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.
![image](https://github.com/jcmgray/cotengra/assets/8982598/300b56c0-9537-49fd-a15c-09611d9e78fa)
- add [`ContractionTree.restore_ind`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#cotengra.ContractionTree.restore_ind) for 'unslicing' or 'unprojecting' previously removed indices.
- [`ContractionTree.from_path`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#cotengra.ContractionTree.from_path): add option `complete` to automatically complete the tree given an incomplete path (usually disconnected subgraphs - 29).
- add [`ContractionTree.get_incomplete_nodes`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#cotengra.ContractionTree.get_incomplete_nodes) for finding all uncontracted childless-parentless node groups.
- add [`ContractionTree.autocomplete`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#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`](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#cotengra.ContractionTree.describe) for a various levels of information about a tree, e.g. `tree.describe("full")` and `tree.describe("concise")`.
- add [ctg.GreedyOptimizer](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/pathfinders/path_basic/index.html#cotengra.pathfinders.path_basic.GreedyOptimizer) and [ctg.OptimalOptimizer](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/pathfinders/path_basic/index.html#cotengra.pathfinders.path_basic.OptimalOptimizer) to the top namespace.
- add [ContractionTree.benchmark](https://cotengra.readthedocs.io/en/latest/autoapi/cotengra/index.html#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: 27.
**Full Changelog**: https://github.com/jcmgray/cotengra/compare/v0.5.6...v0.6.0